%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Integration code for SWI Prolog 6.6.0 and later versions to compile and % load Logtalk files using SWI Prolog consult/1, to support edit/1 and % make/0, and to improve usability when using the XPCE profiler and XPCE % graphical debugger % % Last updated on January 14, 2024 % % This file is part of Logtalk % SPDX-FileCopyrightText: 1998-2023 Paulo Moura % SPDX-License-Identifier: Apache-2.0 % % Licensed under the Apache License, Version 2.0 (the "License"); % you may not use this file except in compliance with the License. % You may obtain a copy of the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, % WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % See the License for the specific language governing permissions and % limitations under the License. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% :- multifile(prolog:make_hook/2). prolog:make_hook(after, _) :- % this explicit integration with make/0 is only necessary % when the logtalk_source_location_data flag is false; % when the flag is true, the integration is handled via % the derived_from/1 option added to loaded files current_prolog_flag(logtalk_source_location_data, false), logtalk_make. :- multifile(user:prolog_load_file/2). :- dynamic(user:prolog_load_file/2). user:prolog_load_file(_:Spec, Flags) :- % exclude calls to use_module/1-2 \+ '$lgt_member'(must_be_module(true), Flags), % exclude calls to ensure_loaded/1 \+ '$lgt_member'(if(not_loaded), Flags), findall(PrologExtension, user:prolog_file_type(PrologExtension,prolog), PrologExtensions), \+ absolute_file_name(Spec, [extensions(PrologExtensions), access(read), file_errors(fail)], _), findall( LogtalkExtension, ( '$lgt_file_extension'(logtalk, DotLogtalkExtension), atom_concat('.', LogtalkExtension, DotLogtalkExtension) ), LogtalkExtensions ), ( atom(Spec) -> expand_file_name(Spec, [SpecExp]), absolute_file_name(SpecExp, [extensions(LogtalkExtensions), access(read), file_errors(fail)], Path) ; Spec =.. [Library, File], % no paths instead of a file name for Logtalk atom(File), '$lgt_expand_library_alias'(Library, LibPath), atom_concat(LibPath, File, Spec2), expand_file_name(Spec2, [SpecExp]), absolute_file_name(SpecExp, [extensions(LogtalkExtensions), access(read), file_errors(fail)], Path) ), '$lgt_swi_filter_compiler_flags'(Flags, Flags2), logtalk_load(Path, Flags2). '$lgt_swi_filter_compiler_flags'([], []). '$lgt_swi_filter_compiler_flags'([Flag| Flags], [Flag| Flags2]) :- functor(Flag, Functor, 1), '$lgt_valid_flag'(Functor), !, '$lgt_swi_filter_compiler_flags'(Flags, Flags2). '$lgt_swi_filter_compiler_flags'([_| Flags], Flags2) :- '$lgt_swi_filter_compiler_flags'(Flags, Flags2). :- multifile(prolog_edit:locate/3). % source files (library notation) prolog_edit:locate(Spec, source_file(Source), [file(Source)]) :- compound(Spec), Spec =.. [Library, Name], atom(Name), '$lgt_expand_library_alias'(Library, LibraryPath), atom_concat(LibraryPath, Name, LogtalkPath), ( file_name_extension(_, Extension, LogtalkPath), atom_concat('.', Extension, DotExtension), '$lgt_file_extension'(logtalk, DotExtension) -> Source = LogtalkPath ; '$lgt_file_extension'(logtalk, DotExtension), atom_concat(LogtalkPath, DotExtension, Source) ), source_file_property(_, derived_from(Source,_)). % source files (by basename) prolog_edit:locate(Spec, source_file(Source), [file(Source)]) :- atom(Spec), logtalk::loaded_file_property(Source, basename(Basename)), ( Spec == Source -> true ; Spec == Basename -> true ; file_name_extension(Spec, _, Basename) ). % included files prolog_edit:locate(Spec, include_file(Source), [file(Source)]) :- atom(Spec), logtalk::loaded_file_property(_, includes(Source)), file_base_name(Source, Basename), ( Spec == Source -> true ; Spec == Basename -> true ; file_name_extension(Spec, _, Basename) ). % entities prolog_edit:locate(Spec, EntitySpec, [file(Source), line(Line)]) :- callable(Spec), ( current_object(Spec) -> object_property(Spec, file(Source)), object_property(Spec, lines(Line,_)), EntitySpec = object(Spec) ; current_category(Spec) -> category_property(Spec, file(Source)), category_property(Spec, lines(Line,_)), EntitySpec = category(Spec) ; atom(Spec), current_protocol(Spec) -> protocol_property(Spec, file(Source)), protocol_property(Spec, lines(Line,_)), EntitySpec = protocol(Spec) ). % public predicates prolog_edit:locate(Entity::Predicate, EntityPredicateSpec, [file(Source), line(Line)]) :- callable(Entity), current_object(Entity), ( Predicate = Functor/Arity -> true ; atom(Predicate), Functor = Predicate ), Entity::current_predicate(Functor/Arity), functor(Template, Functor, Arity), ( Entity::predicate_property(Template, declared_in(DeclarationEntity, Line)), ( current_object(DeclarationEntity) -> object_property(DeclarationEntity, file(Source)) ; current_category(DeclarationEntity) -> category_property(DeclarationEntity, file(Source)) ; atom(DeclarationEntity), protocol_property(DeclarationEntity, file(Source)) ), EntityPredicateSpec = declaration(Functor/Arity) ; Entity::predicate_property(Template, defined_in(DefinitionEntity, Line)), ( current_object(DefinitionEntity) -> object_property(DefinitionEntity, file(Source)) ; current_category(DefinitionEntity), category_property(DefinitionEntity, file(Source)) ), EntityPredicateSpec = definition(Functor/Arity) ). % experimental hack to get a stack trace for errors % generated from top-level message-sending calls /* :- use_module(library(prolog_stack)). %user:prolog_exception_hook(error(Error,logtalk(Goal,ExCtx)), error(Error,logtalk(Goal,ExCtx)), Frame, _CatchFrame) :- user:prolog_exception_hook(Error, Error, Frame, _CatchFrame) :- Error \= error(_, context(_,_)), % SWI-Prolog default hook handles errors with a context/2 context argument get_prolog_backtrace(Frame, 20, Trace), '$lgt_swi_filter_trace'(Trace, TraceFiltered), '$swi_print_backtrace'(TraceFiltered, Error), fail. '$lgt_swi_filter_trace'([], []). '$lgt_swi_filter_trace'([frame(_,_,'$toplevel':_)| Trace], TraceFiltered) :- !, '$lgt_swi_filter_trace'(Trace, TraceFiltered). '$lgt_swi_filter_trace'([frame(N,C,G0)| Trace], [frame(N,C,Entity-Head)| TraceFiltered]) :- '$lgt_decompile_predicate_heads'(G0, Entity, _, Head), !, '$lgt_swi_filter_trace'(Trace, TraceFiltered). '$lgt_swi_filter_trace'([frame(N,C,G)| Trace], [frame(N,C,L)| TraceFiltered]) :- '$lgt_swi_unify_clause_body'(L, _, G, _, _), !, '$lgt_swi_filter_trace'(Trace, TraceFiltered). '$lgt_swi_filter_trace'([_| Trace], TraceFiltered) :- '$lgt_swi_filter_trace'(Trace, TraceFiltered). '$swi_print_backtrace'(TraceFiltered, Error) :- format(user_error, 'Error: ~p~n~n', [Error]), '$swi_print_backtrace'(TraceFiltered). '$swi_print_backtrace'([]). '$swi_print_backtrace'([frame(_,_,Goal)| Frames]) :- format(user_error, '~q~n', [Goal]), '$swi_print_backtrace'(Frames). */ :- multifile(prolog:debug_control_hook/1). prolog:debug_control_hook(spy(Module:Entity::Functor/Arity)) :- '$lgt_compile_predicate_indicators'(Functor/Arity, Entity, TFunctor/TArity), '$lgt_user_module_qualification'(TFunctor/TArity, Module:TFunctor/TArity), spy(Module:TFunctor/TArity). prolog:debug_control_hook(nospy(Module:Entity::Functor/Arity)) :- '$lgt_compile_predicate_indicators'(Functor/Arity, Entity, TFunctor/TArity), '$lgt_user_module_qualification'(TFunctor/TArity, Module:TFunctor/TArity), nospy(Module:TFunctor/TArity). % for e.g. the call stack in the SWI-Prolog graphical tracer :- multifile(user:prolog_predicate_name/2). user:prolog_predicate_name(QualifiedInternalName, UserName) :- '$lgt_user_module_qualification'(InternalName, QualifiedInternalName), '$lgt_swi_prolog_predicate_name'(InternalName, UserName). user:prolog_predicate_name(Goal, Label) :- Goal \= _::_, '$lgt_user_module_qualification'(_, Module:_), ( Goal = Module:THead -> true ; Goal = THead ), functor(THead, TFunctor, TArity), '$lgt_decompile_predicate_indicators'(TFunctor/TArity, Entity, _, Functor/Arity), ( atom(Entity) -> atomic_list_concat([Entity, '::', Functor, '/', Arity], Label) ; functor(Entity, EFunctor, EArity), atomic_list_concat([EFunctor, '/', EArity, '::', Functor, '/', Arity], Label) ). '$lgt_swi_prolog_predicate_name'('$lgt_send_to_obj_'(_, _, _), '::/2 (event-aware)') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_send_to_obj_ne_'(_, _, _), '::/2 (event transparent)') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_send_to_self_'(_, _, _), '::/1') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_obj_super_call_'(_, _, _), '^^/2 (from obj; same pred)') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_ctg_super_call_'(_, _, _), '^^/2 (from ctg; same pred)') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_call_in_this'(_, _), 'call/1') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_call_in_this_checked'(_, _), 'call/1') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_send_to_obj_rt'(_, _, _, _), '::/2 (runtime)') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_send_to_obj'(_, _, _), '::/2 (event transparent)') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_send_to_obj_ne'(_, _, _), '::/2 (event transparent)') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_send_to_self'(_, _), '::/1') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_obj_super_call'(_, _, _), '^^/2 (from obj; same pred)') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_ctg_super_call'(_, _, _), '^^/2 (from ctg; same pred)') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_metacall'(_, _, _, _), 'call/N') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_metacall'(_, _, _), 'call/1') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_quantified_metacall'(_, _, _), 'call/1') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_metacall_local'(_, _), 'call/1') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_metacall_sender'(_, _, _, _), 'call/1') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_bagof'(_, _, _, _, _), 'bagof/3') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_setof'(_, _, _, _, _), 'setof/3') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_expand_term_local'(_, _, _, _), 'expand_term/2') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_expand_term_message'(_, _, _, _, _, _), 'expand_term/2') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_expand_goal_local'(_, _, _, _), 'expand_goal/2') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_expand_goal_message'(_, _, _, _, _), 'expand_goal/2') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_phrase'(_, _, _), 'phrase/2') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_phrase'(_, _, _, _), 'phrase/3') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_compiler_flag'(_, _), 'current_logtalk_flag/2') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_set_compiler_flag'(_, _), 'set_logtalk_flag/2') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_current_op'(_, _, _, _, _, _), 'current_op/3') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_current_predicate'(_, _, _, _), 'current_predicate/1') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_predicate_property'(_, _, _, _, _), 'predicate_property/2') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_abolish_checked'(_, _, _, _, _), 'abolish/1') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_asserta_fact_checked'(_, _, _, _, _, _), 'asserta/1') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_asserta_rule_checked'(_, _, _, _, _, _), 'asserta/1') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_assertz_fact_checked'(_, _, _, _, _, _), 'assertz/1') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_assertz_rule_checked'(_, _, _, _, _, _), 'assertz/1') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_clause_checked'(_, _, _, _, _, _), 'clause/2') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_retract_fact_checked'(_, _, _, _, _), 'retract/1') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_retract_rule_checked'(_, _, _, _, _), 'retract/1') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_retractall_checked'(_, _, _, _, _), 'retractall/1') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_iso_read_term'(_, _, _, _), 'read_term/3') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_iso_read_term'(_, _, _), 'read_term/2') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_iso_read'(_, _, _), 'read/2') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_iso_read'(_, _), 'read/1') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_iso_write_term'(_, _, _, _), 'write_term/3') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_iso_write_term'(_, _, _), 'write_term/2') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_iso_write'(_, _, _), 'write/2') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_iso_write'(_, _), 'write/1') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_iso_writeq'(_, _, _), 'writeq/2') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_iso_writeq'(_, _), 'writeq/1') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_category_parameter'(_, _, _, _), 'parameter/2') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_threaded_or'(_, _, _), 'threaded/1') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_threaded_and'(_, _, _), 'threaded/1') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_threaded_ignore'(_, _, _), 'threaded_ignore/1') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_threaded_call'(_, _, _), 'threaded_call/1') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_threaded_once'(_, _, _), 'threaded_once/1') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_threaded_call_tagged'(_, _, _, _), 'threaded_call/2') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_threaded_once_tagged'(_, _, _, _), 'threaded_once/2') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_threaded_peek'(_, _, _, _), 'threaded_peek/1') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_threaded_peek_tagged'(_, _, _, _, _), 'threaded_peek/2') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_threaded_exit'(_, _, _, _), 'threaded_exit/1') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_threaded_exit_tagged'(_, _, _, _, _), 'threaded_exit/2') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_threaded_cancel_tagged'(_, _), 'threaded_cancel/1') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_threaded_wait_synch_ctg'(_, _, _), 'threaded_wait/1') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_threaded_wait_synch'(_, _, _), 'threaded_wait/1') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_threaded_wait_ctg'(_, _), 'threaded_wait/1') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_threaded_wait'(_, _), 'threaded_wait/1') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_threaded_notify_ctg'(_, _), 'threaded_notify/1') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_threaded_notify'(_, _), 'threaded_notify/1') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_threaded_engine_create'(_, _, _, _, _), 'threaded_engine_create/3') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_threaded_engine_destroy'(_, _), 'threaded_engine_destroy/1') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_threaded_engine_self'(_, _), 'threaded_engine_self/1') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_current_engine_'(_, _), 'threaded_engine/1') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_threaded_engine_next'(_, _, _), 'threaded_engine_next/2') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_threaded_engine_yield'(_, _), 'threaded_engine_yield/1') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_threaded_engine_post'(_, _, _), 'threaded_engine_post/2') :- !. '$lgt_swi_prolog_predicate_name'('$lgt_threaded_engine_fetch'(_, _), 'threaded_engine_fetch/1') :- !. :- multifile(prolog:message//1). prolog:message(error(Error, Context)) --> { callable(Context), Context = logtalk(_, _), '$lgt_print_message'(error, runtime_error(error(Error, Context))) }. :- multifile(prolog:term_compiled/2). prolog:term_compiled(Entity::Head, QHead) :- '$lgt_user_module_qualification'(_, Module:_), ( callable(Entity), callable(Head) -> '$lgt_compile_predicate_heads'(Head, Entity, THead, _), QHead = Module:THead ; callable(QHead) -> ( QHead = Module:THead -> true ; QHead = THead ), '$lgt_decompile_predicate_heads'(THead, Entity, _, Head) ; fail ). :- multifile(prolog_clause:unify_clause_hook/5). prolog_clause:unify_clause_hook(Clause, QClause, Module, TermPos0, TermPos) :- '$lgt_user_module_qualification'(_, Module:_), ( QClause = (Module:THead :- TBody) -> TClause = (THead :- TBody) ; QClause = (THead :- _) -> TClause = QClause ; QClause = Module:THead -> TClause = THead ; QClause = THead -> TClause = QClause ), functor(THead, TFunctor, _), '$lgt_current_flag_'(code_prefix, CodePrefix), atom_concat(CodePrefix, _, TFunctor), '$lgt_swi_prolog_clause:unify_clause_hook'(Clause, TClause, Module, TermPos0, TermPos). '$lgt_swi_prolog_clause:unify_clause_hook'((NonTerminal --> GRBody), (THead :- TBody), Module, TermPos0, TermPos) :- logtalk::expand_term((NonTerminal --> GRBody), Clause), '$lgt_swi_prolog_clause:unify_clause_hook'(Clause, (THead :- TBody), Module, TermPos0, TermPos). '$lgt_swi_prolog_clause:unify_clause_hook'((Head :- Body), (THead :- TBody), _, TermPos0, TermPos) :- '$lgt_swi_unify_clause'((Head :- Body), (THead :- TBody), TermPos0, TermPos). '$lgt_swi_prolog_clause:unify_clause_hook'((Head :- Body), THead, _, TermPos0, TermPos) :- '$lgt_swi_unify_clause'((Head :- Body), (THead :- true), TermPos0, TermPos). '$lgt_swi_prolog_clause:unify_clause_hook'(Head, THead, _, TermPos0, TermPos) :- '$lgt_swi_unify_clause'(Head, THead, TermPos0, TermPos). :- multifile(prolog_clause:make_varnames_hook/5). prolog_clause:make_varnames_hook((Head --> _), (Module:THead :- _), Offsets, Names, Bindings) :- '$lgt_user_module_qualification'(_, Module:_), functor(THead, TFunctor, THeadArity), '$lgt_current_flag_'(code_prefix, CodePrefix), atom_concat(CodePrefix, _, TFunctor), N is THeadArity - 1, memberchk(N=EVar, Offsets), Names1 = ['c(This, Entity, r(Sender, Self, MetaCallContext, Stack))'=EVar| Names], functor(Head, _, HeadArity), In is HeadArity, memberchk(In=IVar, Offsets), Names2 = [''=IVar|Names1], Out is HeadArity + 1, memberchk(Out=OVar, Offsets), Names3 = [''=OVar|Names2], prolog_clause:make_varnames(xx, xx, Offsets, Names3, Bindings). prolog_clause:make_varnames_hook((Head --> _), (THead :- _), Offsets, Names, Bindings) :- functor(THead, TFunctor, THeadArity), '$lgt_current_flag_'(code_prefix, CodePrefix), atom_concat(CodePrefix, _, TFunctor), N is THeadArity - 1, memberchk(N=EVar, Offsets), Names1 = ['c(This, Entity, r(Sender, Self, MetaCallContext, Stack))'=EVar| Names], functor(Head, _, HeadArity), In is HeadArity, memberchk(In=IVar, Offsets), Names2 = [''=IVar|Names1], Out is HeadArity + 1, memberchk(Out=OVar, Offsets), Names3 = [''=OVar|Names2], prolog_clause:make_varnames(xx, xx, Offsets, Names3, Bindings). prolog_clause:make_varnames_hook(_, (Module:THead :- _), Offsets, Names, Bindings) :- '$lgt_user_module_qualification'(_, Module:_), functor(THead, TFunctor, Arity), '$lgt_current_flag_'(code_prefix, CodePrefix), atom_concat(CodePrefix, _, TFunctor), N is Arity - 1, memberchk(N=IVar, Offsets), Names1 = ['c(This, Entity, r(Sender, Self, MetaCallCtx, CoinductionStack))'=IVar| Names], prolog_clause:make_varnames(xx, xx, Offsets, Names1, Bindings). prolog_clause:make_varnames_hook(_, (THead :- _), Offsets, Names, Bindings) :- functor(THead, TFunctor, Arity), '$lgt_current_flag_'(code_prefix, CodePrefix), atom_concat(CodePrefix, _, TFunctor), N is Arity - 1, memberchk(N=IVar, Offsets), Names1 = ['c(This, Entity, r(Sender, Self, MetaCallCtx, CoinductionStack))'=IVar| Names], prolog_clause:make_varnames(xx, xx, Offsets, Names1, Bindings). '$lgt_swi_unify_clause'((Head :- Body), (THead :- TBody), TermPos0, TermPos) :- !, '$lgt_decompile_predicate_heads'(THead, Entity, _, Head), '$lgt_swi_unify_clause_body'(Body, Entity, TBody, TermPos0, TermPos). '$lgt_swi_unify_clause'(Head, THead, TermPos, TermPos) :- !, '$lgt_decompile_predicate_heads'(THead, _, _, Head). '$lgt_swi_unify_clause_body'((Goal1, Goal2), Entity, (TGoal1, TGoal2), TermPos0, TermPos) :- !, '$lgt_swi_unify_clause_body'(Goal1, Entity, TGoal1, TermPos0, TermPos1), '$lgt_swi_unify_clause_body'(Goal2, Entity, TGoal2, TermPos1, TermPos). '$lgt_swi_unify_clause_body'((Goal1; Goal2), Entity, (TGoal1; TGoal2), TermPos0, TermPos) :- !, '$lgt_swi_unify_clause_body'(Goal1, Entity, TGoal1, TermPos0, TermPos1), '$lgt_swi_unify_clause_body'(Goal2, Entity, TGoal2, TermPos1, TermPos). '$lgt_swi_unify_clause_body'((Goal1 -> Goal2), Entity, (TGoal1 -> TGoal2), TermPos0, TermPos) :- !, '$lgt_swi_unify_clause_body'(Goal1, Entity, TGoal1, TermPos0, TermPos1), '$lgt_swi_unify_clause_body'(Goal2, Entity, TGoal2, TermPos1, TermPos). '$lgt_swi_unify_clause_body'((Goal1 *-> Goal2), Entity, (TGoal1 *-> TGoal2), TermPos0, TermPos) :- !, '$lgt_swi_unify_clause_body'(Goal1, Entity, TGoal1, TermPos0, TermPos1), '$lgt_swi_unify_clause_body'(Goal2, Entity, TGoal2, TermPos1, TermPos). '$lgt_swi_unify_clause_body'(Var^Goal, Entity, Var^TGoal, TermPos0, TermPos) :- !, '$lgt_swi_unify_clause_body'(Goal, Entity, TGoal, TermPos0, TermPos). '$lgt_swi_unify_clause_body'(Obj::Msg, _, '$lgt_send_to_obj_ne_nv'(Obj, Msg, _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(Obj::Msg, _, '$lgt_send_to_obj_ne'(Obj, Msg, _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(Obj::Msg, _, '$lgt_send_to_obj_ne_'(Obj, Msg, _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(Obj::Msg, _, '$lgt_send_to_obj_'(Obj, Msg, _), TermPos, TermPos) :- !. % implicit message-sending via uses/2 directives '$lgt_swi_unify_clause_body'(Msg, _, '$lgt_send_to_obj_ne_nv'(_, Msg, _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(Msg, _, '$lgt_send_to_obj_ne'(_, Msg, _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(Msg, _, '$lgt_send_to_obj_ne_'(_, Msg, _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(Msg, _, '$lgt_send_to_obj_'(_, Msg, _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(::Msg, _, '$lgt_send_to_self'(Msg, _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(::Msg, _, '$lgt_send_to_self_nv'(_, Msg, _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(::Msg, _, '$lgt_send_to_self_'(_, Msg, _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(^^Msg, _, '$lgt_obj_super_call'(_, Msg, _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(^^Msg, _, '$lgt_obj_super_call_'(_, Msg, _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(^^Msg, _, '$lgt_ctg_super_call'(_, Msg, _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(^^Msg, _, '$lgt_ctg_super_call_'(_, Msg, _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(Goal, _, '$lgt_call_in_this'(Goal, _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(Goal, _, '$lgt_call_in_this_checked'(Goal, _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(Obj< true; fail), TermPos0, TermPos) :- !, '$lgt_swi_unify_clause_body'(Goal, Entity, TGoal, TermPos0, TermPos). '$lgt_swi_unify_clause_body'(ignore(Goal), Entity, (TGoal -> true; true), TermPos0, TermPos) :- !, '$lgt_swi_unify_clause_body'(Goal, Entity, TGoal, TermPos0, TermPos). '$lgt_swi_unify_clause_body'(catch(Goal, Catcher, Recover), Entity, catch(TGoal, Catcher, TRecover), TermPos0, TermPos) :- !, '$lgt_swi_unify_clause_body'(Goal, Entity, TGoal, TermPos0, TermPos1), '$lgt_swi_unify_clause_body'(Recover, Entity, TRecover, TermPos1, TermPos). '$lgt_swi_unify_clause_body'(CallN, _, '$lgt_metacall'(Closure, ExtraArgs, _, _), TermPos, TermPos) :- !, functor(CallN, call, Arity), !, length(ExtraArgs, N), Arity is N + 1, arg(1, CallN, Closure), '$lgt_swi_call_n_args'(ExtraArgs, 2, CallN). '$lgt_swi_unify_clause_body'(Goal, _, '$lgt_metacall'(Goal, _, _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(Goal, _, '$lgt_quantified_metacall'(Goal, _, _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(Goal, _, '$lgt_metacall_local'(Goal, _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(Goal, _, '$lgt_metacall_sender'(Goal, _, _, _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(bagof(Term, QGoal, List), _, '$lgt_bagof'(Term, QGoal, List, _, _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(bagof(Term, Goal, List), Entity, bagof(Term, TGoal, List), TermPos0, TermPos) :- !, '$lgt_swi_unify_clause_body'(Goal, Entity, TGoal, TermPos0, TermPos). '$lgt_swi_unify_clause_body'(setof(Term, QGoal, List), _, '$lgt_setof'(Term, QGoal, List, _, _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(setof(Term, Goal, List), Entity, setof(Term, TGoal, List), TermPos0, TermPos) :- !, '$lgt_swi_unify_clause_body'(Goal, Entity, TGoal, TermPos0, TermPos). '$lgt_swi_unify_clause_body'(findall(Term, Goal, List), Entity, findall(Term, TGoal, List), TermPos0, TermPos) :- !, '$lgt_swi_unify_clause_body'(Goal, Entity, TGoal, TermPos0, TermPos). '$lgt_swi_unify_clause_body'(abolish(PI), Entity, abolish(TPI), TermPos, TermPos) :- '$lgt_decompile_predicate_indicators'(TPI, Entity, _, PI), !. '$lgt_swi_unify_clause_body'(asserta(Clause), Entity, asserta(TClause), TermPos, TermPos) :- '$lgt_decompile_predicate_heads'(TClause, Entity, _, Clause), !. '$lgt_swi_unify_clause_body'(assertz(Clause), Entity, assertz(TClause), TermPos, TermPos) :- '$lgt_decompile_predicate_heads'(TClause, Entity, _, Clause), !. '$lgt_swi_unify_clause_body'(retract(Clause), Entity, retract(TClause), TermPos, TermPos) :- '$lgt_decompile_predicate_heads'(TClause, Entity, _, Clause), !. '$lgt_swi_unify_clause_body'(expand_term(Term, Expansion), _, '$lgt_expand_term_local'(_, Term, Expansion, _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(::expand_term(Term, Expansion), _, '$lgt_expand_term_message'(_, Term, Expansion, _, p(_)), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(Obj::expand_term(Term, Expansion), _, '$lgt_expand_term_message'(Obj, Term, Expansion, _, p(p(p))), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(expand_goal(Goal, EGoal), _, '$lgt_expand_goal_local'(Goal, EGoal, _, _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(::expand_goal(Goal, EGoal), _, '$lgt_expand_goal_message'(_, Goal, EGoal, _, p(_)), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(Obj::expand_goal(Goal, EGoal), _, '$lgt_expand_goal_message'(Obj, Goal, EGoal, _, p(p(p))), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(phrase(GRBody, Input), _, '$lgt_phrase'(GRBody, Input, _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(phrase(GRBody, Input, Rest), _, '$lgt_phrase'(GRBody, Input, Rest, _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(current_logtalk_flag(Flag, Value), _, '$lgt_compiler_flag'(Flag, Value), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(set_logtalk_flag(Flag, Value), _, '$lgt_set_compiler_flag'(Flag, Value), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(Obj::current_op(Priority, Specifier, Operator), _, '$lgt_current_op'(Obj, Priority, Specifier, Operator, _, p(p(p))), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(current_op(Priority, Specifier, Operator), _, '$lgt_current_op'(This, Priority, Specifier, Operator, This, p(_)), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(::current_op(Priority, Specifier, Operator), _, '$lgt_current_op'(_, Priority, Specifier, Operator, _, p(_)), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(Obj::current_predicate(PI), _, '$lgt_current_predicate'(Obj, PI, _, p(p(p))), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(current_predicate(PI), _, '$lgt_current_predicate'(This, PI, This, p(_)), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(::current_predicate(PI), _, '$lgt_current_predicate'(_, PI, _, p(_)), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(Obj::predicate_property(Pred, Prop), _, '$lgt_predicate_property'(Obj, Pred, Prop, _, p(p(p))), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(predicate_property(Pred, Prop), _, '$lgt_predicate_property'(This, Pred, Prop, This, p(_)), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(::predicate_property(Pred, Prop), _, '$lgt_predicate_property'(_, Pred, Prop, _, p(_)), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(Obj::abolish(PI), _, '$lgt_abolish_checked'(Obj, PI, _, p(p(p))), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(abolish(PI), _, '$lgt_abolish_checked'(_, PI, _, p(_)), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(::abolish(PI), _, '$lgt_abolish_checked'(_, PI, _, p(_)), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(asserta(Clause), _, '$lgt_asserta_fact_checked'(_, Clause, _, _, p), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(::asserta(Clause), _, '$lgt_asserta_fact_checked'(_, Clause, _, _, p(p)), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(Obj::asserta(Clause), _, '$lgt_asserta_fact_checked'(Obj, Clause, _, _, p(p(p))), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(asserta(Clause), _, '$lgt_asserta_rule_checked'(_, Clause, _, _, p), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(::asserta(Clause), _, '$lgt_asserta_rule_checked'(_, Clause, _, _, p(p)), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(Obj::asserta(Clause), _, '$lgt_asserta_rule_checked'(Obj, Clause, _, _, p(p(p))), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(assertz(Clause), _, '$lgt_assertz_fact_checked'(_, Clause, _, _, p), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(::assertz(Clause), _, '$lgt_assertz_fact_checked'(_, Clause, _, _, p(p)), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(Obj::assertz(Clause), _, '$lgt_assertz_fact_checked'(Obj, Clause, _, _, p(p(p))), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(assertz(Clause), _, '$lgt_assertz_rule_checked'(_, Clause, _, _, p), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(::assertz(Clause), _, '$lgt_assertz_rule_checked'(_, Clause, _, _, p(p)), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(Obj::assertz(Clause), _, '$lgt_assertz_rule_checked'(Obj, Clause, _, _, p(p(p))), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(Obj::clause(Head, Body), _, '$lgt_clause_checked'(Obj, Head, Body, _, p(p(p))), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(clause(Head, Body), _, '$lgt_clause_checked'(_, Head, Body, _, p(_)), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(::clause(Head, Body), _, '$lgt_clause_checked'(_, Head, Body, _, p(_)), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(Obj::retract(Head), _, '$lgt_retract_fact_checked'(Obj, Head, _, p(p(p)), _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(retract(Head), _, '$lgt_retract_fact_checked'(_, Head, _, p(_), _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(::retract(Head), _, '$lgt_retract_fact_checked'(_, Head, _, p(_), _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(Obj::retract(Clause), _, '$lgt_retract_rule_checked'(Obj, Clause, _, p(p(p)), _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(retract(Clause), _, '$lgt_retract_rule_checked'(_, Clause, _, p(_), _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(::retract(Clause), _, '$lgt_retract_rule_checked'(_, Clause, _, p(_), _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(Obj::retractall(Head), _, '$lgt_retractall_checked'(Obj, Head, _, p(p(p)), _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(retractall(Head), _, '$lgt_retractall_checked'(_, Head, _, p(_), _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(::retractall(Head), _, '$lgt_retractall_checked'(_, Head, _, p(_), _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(read_term(Stream, Term, Options), _, '$lgt_iso_read_term'(Stream, Term, Options, _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(read_term(Term, Options), _, '$lgt_iso_read_term'(Term, Options, _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(read(Stream, Term), _, '$lgt_iso_read'(Stream, Term, _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(read(Term), _, '$lgt_iso_read'(Term, _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(write_term(Stream, Term, Options), _, '$lgt_iso_write_term'(Stream, Term, Options, _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(write_term(Term, Options), _, '$lgt_iso_write_term'(Term, Options, _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(write(Stream, Term), _, '$lgt_iso_write'(Stream, Term, _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(write(Term), _, '$lgt_iso_write'(Term, _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(writeq(Stream, Term), _, '$lgt_iso_writeq'(Stream, Term, _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(writeq(Term), _, '$lgt_iso_writeq'(Term, _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(parameter(Arg, Value), _, '$lgt_category_parameter'(_, _, Arg, Value), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(parameter(_, _), _, true, TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(sender(_), _, true, TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(self(_), _, true, TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(this(_), _, true, TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(threaded(Goals), Entity, '$lgt_threaded_or'(_, MTGoals, _), TermPos0, TermPos) :- !, '$lgt_swi_unify_threaded_goals'(Goals, Entity, MTGoals, TermPos0, TermPos). '$lgt_swi_unify_clause_body'(threaded(Goals), Entity, '$lgt_threaded_and'(_, MTGoals, _), TermPos0, TermPos) :- !, '$lgt_swi_unify_threaded_goals'(Goals, Entity, MTGoals, TermPos0, TermPos). '$lgt_swi_unify_clause_body'(threaded(Goal), Entity, (TGoal -> true; fail), TermPos0, TermPos) :- !, '$lgt_swi_unify_clause_body'(Goal, Entity, TGoal, TermPos0, TermPos). '$lgt_swi_unify_clause_body'(threaded_ignore(Goal), _, '$lgt_threaded_ignore'(Goal, _, _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(threaded_call(Goal), _, '$lgt_threaded_call'(Goal, _, _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(threaded_once(Goal), _, '$lgt_threaded_once'(Goal, _, _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(threaded_call(Goal, Tag), _, '$lgt_threaded_call_tagged'(Goal, _, _, Tag), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(threaded_once(Goal, Tag), _, '$lgt_threaded_once_tagged'(Goal, _, _, Tag), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(threaded_peek(Goal), Entity, '$lgt_threaded_peek'(TGoal, _, _, _), TermPos0, TermPos) :- !, '$lgt_swi_unify_clause_body'(Goal, Entity, TGoal, TermPos0, TermPos). '$lgt_swi_unify_clause_body'(threaded_peek(Goal, Tag), Entity, '$lgt_threaded_peek_tagged'(TGoal, _, _, _, Tag), TermPos0, TermPos) :- !, '$lgt_swi_unify_clause_body'(Goal, Entity, TGoal, TermPos0, TermPos). '$lgt_swi_unify_clause_body'(threaded_exit(Goal), Entity, '$lgt_threaded_exit'(TGoal, _, _, _), TermPos0, TermPos) :- !, '$lgt_swi_unify_clause_body'(Goal, Entity, TGoal, TermPos0, TermPos). '$lgt_swi_unify_clause_body'(threaded_exit(Goal, Tag), Entity, '$lgt_threaded_exit_tagged'(TGoal, _, _, _, Tag), TermPos0, TermPos) :- !, '$lgt_swi_unify_clause_body'(Goal, Entity, TGoal, TermPos0, TermPos). '$lgt_swi_unify_clause_body'(threaded_cancel(Tag), _, '$lgt_threaded_cancel_tagged'(Tag, _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(threaded_wait(Msg), _, '$lgt_threaded_wait_synch_ctg'(_, Msg, _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(threaded_wait(Msg), _, '$lgt_threaded_wait_synch'(_, Msg, _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(threaded_wait(Msg), _, '$lgt_threaded_wait_ctg'(Msg, _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(threaded_wait(Msg), _, '$lgt_threaded_wait'(Msg, _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(threaded_notify(Msg), _, '$lgt_threaded_notify_ctg'(Msg, _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(threaded_notify(Msg), _, '$lgt_threaded_notify'(Msg, _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(threaded_engine_create(Answer, Goal, Engine), _, '$lgt_threaded_engine_create'(Answer, Goal, _, _, Engine), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(threaded_engine_destroy(Engine), _, '$lgt_threaded_engine_destroy'(Engine, _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(threaded_engine_self(Engine), _, '$lgt_threaded_engine_self'(Engine, _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(threaded_engine(Engine), _, '$lgt_current_engine_'(Engine, _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(threaded_engine_next(Engine, Answer), _, '$lgt_threaded_engine_next'(Engine, Answer, _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(threaded_engine_yield(Answer), _, '$lgt_threaded_engine_yield'(Answer, _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(threaded_engine_post(Engine, Term), _, '$lgt_threaded_engine_post'(Engine, Term, _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(threaded_engine_fetch(Term), _, '$lgt_threaded_engine_fetch'(Term, _), TermPos, TermPos) :- !. '$lgt_swi_unify_clause_body'(Goal, Entity, with_mutex(_, TGoal), TermPos0, TermPos) :- \+ functor(Goal, with_mutex, 2), % synchronized predicates !, '$lgt_swi_unify_clause_body'(Goal, Entity, TGoal, TermPos0, TermPos). '$lgt_swi_unify_clause_body'(Goal, _, Goal, TermPos, TermPos) :- % built-in predicates !. '$lgt_swi_unify_clause_body'(Goal, _, TGoal, TermPos, TermPos) :- % object and category user predicates '$lgt_decompile_predicate_heads'(TGoal, GoalEntity, _, Goal0), functor(Goal0, Functor0, _), ( atom_concat(Functor1, '__sync', Functor0) -> % synchronized predicate Goal0 =.. [Functor0| Args], Goal1 =.. [Functor1| Args] ; atom_concat(Functor1, '__coinductive', Functor0) -> % coinductive predicate Goal0 =.. [Functor0| Args], Goal1 =.. [Functor1| Args] ; Goal1 = Goal0 ), ( Goal = Goal1 ; Goal = GoalEntity::Goal1 ), !. '$lgt_swi_unify_clause_body'(_, _, _, TermPos, TermPos). % just in case... '$lgt_swi_unify_threaded_goals'((Goal1, Goal2), Entity, (TGoal1, TGoal2), TermPos0, TermPos) :- !, '$lgt_swi_unify_threaded_goal'(Goal1, Entity, TGoal1, TermPos0, TermPos1), '$lgt_swi_unify_threaded_goals'(Goal2, Entity, TGoal2, TermPos1, TermPos). '$lgt_swi_unify_threaded_goals'((Goal1; Goal2), Entity, (TGoal1; TGoal2), TermPos0, TermPos) :- !, '$lgt_swi_unify_threaded_goal'(Goal1, Entity, TGoal1, TermPos0, TermPos1), '$lgt_swi_unify_threaded_goals'(Goal2, Entity, TGoal2, TermPos1, TermPos). '$lgt_swi_unify_threaded_goals'(Goal, Entity, TGoal, TermPos0, TermPos) :- '$lgt_swi_unify_threaded_goal'(Goal, Entity, TGoal, TermPos0, TermPos). '$lgt_swi_unify_threaded_goal'(Goal, Entity, '$lgt_threaded_goal'(TGoal, _, _, _), TermPos0, TermPos) :- '$lgt_swi_unify_clause_body'(Goal, Entity, TGoal, TermPos0, TermPos). '$lgt_swi_call_n_args'([], _, _). '$lgt_swi_call_n_args'([Arg| Args], N, CallN) :- arg(N, CallN, Arg), N2 is N + 1, '$lgt_swi_call_n_args'(Args, N2, CallN). % the following directives are necessary when using the SWI-Prolog % graphical tracer as predicates whose name start with a $ have by % default a "notrace" property :- '$set_predicate_attribute'('$lgt_send_to_obj_rt'/4, trace, 1). :- '$set_predicate_attribute'('$lgt_send_to_self_nv'/3, trace, 1). :- '$set_predicate_attribute'('$lgt_send_to_self'/3, trace, 1). :- '$set_predicate_attribute'('$lgt_send_to_self_'/3, trace, 1). :- '$set_predicate_attribute'('$lgt_send_to_obj'/3, trace, 1). :- '$set_predicate_attribute'('$lgt_send_to_obj_'/3, trace, 1). :- '$set_predicate_attribute'('$lgt_send_to_obj_nv'/3, trace, 1). :- '$set_predicate_attribute'('$lgt_send_to_obj_ne_nv'/3, trace, 1). :- '$set_predicate_attribute'('$lgt_send_to_obj_ne'/3, trace, 1). :- '$set_predicate_attribute'('$lgt_send_to_obj_ne_'/3, trace, 1). :- '$set_predicate_attribute'('$lgt_obj_super_call'/3, trace, 1). :- '$set_predicate_attribute'('$lgt_obj_super_call_'/3, trace, 1). :- '$set_predicate_attribute'('$lgt_ctg_super_call'/3, trace, 1). :- '$set_predicate_attribute'('$lgt_ctg_super_call_'/3, trace, 1). :- '$set_predicate_attribute'('$lgt_call_in_this'/2, trace, 1). :- '$set_predicate_attribute'('$lgt_metacall'/3, trace, 1). :- '$set_predicate_attribute'('$lgt_metacall'/4, trace, 1). :- '$set_predicate_attribute'('$lgt_quantified_metacall'/3, trace, 1). :- '$set_predicate_attribute'('$lgt_metacall_local'/2, trace, 1). :- '$set_predicate_attribute'('$lgt_metacall_sender'/4, trace, 1). :- '$set_predicate_attribute'('$lgt_expand_term_local'/4, trace, 1). :- '$set_predicate_attribute'('$lgt_expand_term_message'/5, trace, 1). :- '$set_predicate_attribute'('$lgt_expand_goal_local'/4, trace, 1). :- '$set_predicate_attribute'('$lgt_expand_goal_message'/5, trace, 1). :- '$set_predicate_attribute'('$lgt_phrase'/3, trace, 1). :- '$set_predicate_attribute'('$lgt_phrase'/4, trace, 1). :- '$set_predicate_attribute'('$lgt_abolish_checked'/4, trace, 1). :- '$set_predicate_attribute'('$lgt_asserta_fact_checked'/5, trace, 1). :- '$set_predicate_attribute'('$lgt_asserta_rule_checked'/5, trace, 1). :- '$set_predicate_attribute'('$lgt_assertz_fact_checked'/5, trace, 1). :- '$set_predicate_attribute'('$lgt_assertz_rule_checked'/5, trace, 1). :- '$set_predicate_attribute'('$lgt_clause_checked'/5, trace, 1). :- '$set_predicate_attribute'('$lgt_retract_fact_checked'/4, trace, 1). :- '$set_predicate_attribute'('$lgt_retract_rule_checked'/4, trace, 1). :- '$set_predicate_attribute'('$lgt_retractall_checked'/4, trace, 1). :- '$set_predicate_attribute'('$lgt_iso_read_term'/4, trace, 1). :- '$set_predicate_attribute'('$lgt_iso_read_term'/3, trace, 1). :- '$set_predicate_attribute'('$lgt_iso_read'/3, trace, 1). :- '$set_predicate_attribute'('$lgt_iso_read'/2, trace, 1). :- '$set_predicate_attribute'('$lgt_iso_write_term'/4, trace, 1). :- '$set_predicate_attribute'('$lgt_iso_write_term'/3, trace, 1). :- '$set_predicate_attribute'('$lgt_iso_write'/3, trace, 1). :- '$set_predicate_attribute'('$lgt_iso_write'/2, trace, 1). :- '$set_predicate_attribute'('$lgt_iso_writeq'/3, trace, 1). :- '$set_predicate_attribute'('$lgt_iso_writeq'/2, trace, 1). :- '$set_predicate_attribute'('$lgt_category_parameter'/4, trace, 1). :- '$set_predicate_attribute'('$lgt_threaded_or'/3, trace, 1). :- '$set_predicate_attribute'('$lgt_threaded_and'/3, trace, 1). :- '$set_predicate_attribute'('$lgt_threaded_ignore'/3, trace, 1). :- '$set_predicate_attribute'('$lgt_threaded_call'/4, trace, 1). :- '$set_predicate_attribute'('$lgt_threaded_once'/4, trace, 1). :- '$set_predicate_attribute'('$lgt_threaded_call_tagged'/5, trace, 1). :- '$set_predicate_attribute'('$lgt_threaded_once_tagged'/5, trace, 1). :- '$set_predicate_attribute'('$lgt_threaded_peek'/4, trace, 1). :- '$set_predicate_attribute'('$lgt_threaded_peek'/5, trace, 1). :- '$set_predicate_attribute'('$lgt_threaded_peek_tagged'/5, trace, 1). :- '$set_predicate_attribute'('$lgt_threaded_peek_tagged'/6, trace, 1). :- '$set_predicate_attribute'('$lgt_threaded_exit'/4, trace, 1). :- '$set_predicate_attribute'('$lgt_threaded_exit'/5, trace, 1). :- '$set_predicate_attribute'('$lgt_threaded_exit_tagged'/5, trace, 1). :- '$set_predicate_attribute'('$lgt_threaded_exit_tagged'/6, trace, 1). :- '$set_predicate_attribute'('$lgt_threaded_cancel_tagged'/2, trace, 1). :- '$set_predicate_attribute'('$lgt_threaded_wait_synch_ctg'/3, trace, 1). :- '$set_predicate_attribute'('$lgt_threaded_wait_synch'/3, trace, 1). :- '$set_predicate_attribute'('$lgt_threaded_wait_ctg'/2, trace, 1). :- '$set_predicate_attribute'('$lgt_threaded_wait'/2, trace, 1). :- '$set_predicate_attribute'('$lgt_threaded_notify_ctg'/2, trace, 1). :- '$set_predicate_attribute'('$lgt_threaded_notify'/2, trace, 1). :- '$set_predicate_attribute'('$lgt_threaded_engine_create_protected'/5, trace, 1). :- '$set_predicate_attribute'('$lgt_threaded_engine_create'/5, trace, 1). :- '$set_predicate_attribute'('$lgt_threaded_engine_destroy'/2, trace, 1). :- '$set_predicate_attribute'('$lgt_threaded_engine_self'/2, trace, 1). :- '$set_predicate_attribute'('$lgt_current_engine_'/2, trace, 1). :- '$set_predicate_attribute'('$lgt_threaded_engine_next'/3, trace, 1). :- '$set_predicate_attribute'('$lgt_threaded_engine_yield'/2, trace, 1). :- '$set_predicate_attribute'('$lgt_threaded_engine_post'/3, trace, 1). :- '$set_predicate_attribute'('$lgt_threaded_engine_fetch'/2, trace, 1). % add dummy meta_predicate/1 directives to avoid cluttering the make/0 % analysis report (as some of the results are not correct for all usage % cases and can lead to false warnings) :- meta_predicate '$lgt_ctg_super_call_nv'(*,*,*). :- meta_predicate '$lgt_obj_super_call_nv'(*,*,*). :- meta_predicate '$lgt_category_property_declares'(*,*,*,*). :- meta_predicate '$lgt_category_property'(*,*,*,*,*,*). :- meta_predicate '$lgt_send_to_obj_nv_inner'(*,*,*,*). :- meta_predicate '$lgt_object_property_declares'(*,*,*,*,*,*). :- meta_predicate '$lgt_object_property_defines'(*,*,*,*,*,*). :- meta_predicate '$lgt_find_original_predicate'(*,*,*,*,*,*). :- meta_predicate '$lgt_find_original_predicate'(*,*,*,*,*,*,*). :- meta_predicate '$lgt_entity_property_alias'(*,*,*,*,*). :- meta_predicate '$lgt_expand_goal_category_scoped'(*,*,*,*). :- meta_predicate '$lgt_expand_goal_category_local'(*,*,*,*,*). :- meta_predicate '$lgt_expand_goal_object_scoped'(*,*,*,*). :- meta_predicate '$lgt_expand_goal_object_local'(*,*,*,*,*,*). :- meta_predicate '$lgt_expand_goal_message'(*,*,*,*,*). :- meta_predicate '$lgt_assert_pred_dcl'(*,*,*,*,*,*,*,*,*,*,*,*,*). :- meta_predicate '$lgt_define_events'(*,*,*,*,*,*,*). :- meta_predicate '$lgt_threaded_or'(*,*,*). :- meta_predicate '$lgt_mt_non_det_goal'(*,*,*,*,*,*). :- meta_predicate '$lgt_protocol_property_declares'(*,*,*,*). :- meta_predicate '$lgt_guarded_method_call'(*,*,*,*). :- meta_predicate '$lgt_threaded_and'(*,*,*). :- meta_predicate '$lgt_category_property_defines'(*,*,*,*,*). :- meta_predicate '$lgt_protocol_property'(*,*,*,*,*). :- meta_predicate '$lgt_mt_det_goal'(*,*,*,*,*,*). :- meta_predicate '$lgt_abolish_entity_predicates'(*). :- meta_predicate '$lgt_predicate_property_user'(*,*,*,*,*,*,*,*,*,*,*). :- meta_predicate '$lgt_send_to_obj_ne_nv'(*,*,*). :- meta_predicate '$lgt_mt_threaded_call'(*,*,*). :- meta_predicate '$lgt_send_to_obj_nv'(*,*,*). :- meta_predicate '$lgt_complemented_object'(*,*,*,*,*,*,*,*). :- meta_predicate '$lgt_complemented_object'(*,*,*,*,*,*). :- meta_predicate '$lgt_object_property'(*,*,*,*,*,*,*,*). :- meta_predicate '$lgt_object_property_resources'(*,*,*,*,*,*). :- meta_predicate '$lgt_object_property_resource'(*,*,*,*,*,*). :- meta_predicate '$lgt_protocol_property_resources'(*,*,*,*,*). :- meta_predicate '$lgt_protocol_property_resource'(*,*,*,*,*). :- meta_predicate '$lgt_category_property_resource'(*,*,*,*,*). :- meta_predicate '$lgt_category_property_resources'(*,*,*,*,*). :- meta_predicate '$lgt_check_for_tautology_or_falsehood_goal'(*,*). :- meta_predicate '$lgt_assert_pred_def'(*,*,*,*,*,*,*,*). :- meta_predicate '$lgt_send_to_self_nv'(*,*,*). :- meta_predicate threaded(*). :- meta_predicate '$lgt_threaded_goal'(*,*,*,*). :- meta_predicate '$lgt_threaded_call'(*,*,*). :- meta_predicate '$lgt_threaded_once'(*,*,*). :- meta_predicate '$lgt_ctg_super_call_'(*,*,*). :- meta_predicate '$lgt_send_to_obj_'(*,*,*). :- meta_predicate '$lgt_obj_super_call_'(*,*,*). :- meta_predicate '$lgt_send_to_obj_ne_'(*,*,*). :- meta_predicate '$lgt_threaded_once_tagged'(*,*,*,*). :- meta_predicate '$lgt_send_to_self_'(*,*,*). :- meta_predicate '$lgt_threaded_call_tagged'(*,*,*,*). :- meta_predicate '$lgt_threaded_ignore'(*,*,*). :- meta_predicate '$lgt_send_to_obj_rt'(*,*,*,*). :- meta_predicate '$lgt_send_to_obj_ne'(*,*,*). :- meta_predicate '$lgt_ctg_super_call'(*,*,*). :- meta_predicate '$lgt_obj_super_call'(*,*,*). :- meta_predicate '$lgt_send_to_obj'(*,*,*). :- meta_predicate '$lgt_send_to_self'(*,*). :- meta_predicate '$lgt_call_within_context_nv'(*,*,*). :- meta_predicate '$lgt_call_within_context'(*,*,*). :- meta_predicate '$lgt_metacall'(*,*,*). :- meta_predicate '$lgt_metacall'(*,*,*,*). :- meta_predicate '$lgt_quantified_metacall'(*,*,*). :- meta_predicate '$lgt_metacall_sender'(*,*,*,*). :- meta_predicate '$lgt_metacall_local'(*,*). :- meta_predicate '$lgt_mt_engine_goal'(*,*,*,*,*). :- meta_predicate '$lgt_threaded_engine_create_protected'(*,*,*,*,*). :- meta_predicate '$lgt_threaded_engine_create'(*,*,*,*,*). :- meta_predicate '$user#0.forward#1'(*,*).