Files
scryer-prolog/src/loader.pl

1591 lines
64 KiB
Prolog

:- module(loader, [consult/1,
expand_goal/3,
expand_term/2,
file_load/2,
load/1,
predicate_property/2,
prolog_load_context/2,
strip_module/3,
use_module/1,
use_module/2,
current_module/1
]).
:- use_module(library(error)).
:- use_module(library(lists)).
:- use_module(library(pairs)).
write_error(Error) :-
% '$fetch_global_var' is the core system call of bb_get/2, but
% bb_get may not exist when write_error is first called, so fall
% back on '$fetch_global_var'.
( '$fetch_global_var'('$first_answer', false) ->
true
; write(' ') % if '$first_answer' isn't defined yet or true,
% print indentation.
),
( nonvar(Error),
functor(Error, error, 2) ->
writeq(Error)
; writeq(throw(Error))
),
write('.').
'$print_message_and_fail'(inference_limit_exceeded(B)) :-
integer(B),
throw(inference_limit_exceeded(B)).
'$print_message_and_fail'(Error) :-
write_error(Error),
nl,
'$fail'.
expand_term(Term, ExpandedTerm) :-
( '$predicate_defined'(user, term_expansion, 2),
catch('$call'(user:term_expansion(Term, ExpandedTerm0)),
E,
'$call'(loader:'$print_message_and_fail'(E))) ->
( var(ExpandedTerm0) ->
error:instantiation_error(term_expansion/2)
; ExpandedTerm0 = [_|_] ->
term_expansion_list(ExpandedTerm0, ExpandedTerm, [])
; expand_term(ExpandedTerm0, ExpandedTerm)
)
; Term = ExpandedTerm
).
term_expansion_list([], ExpandedTerms, ExpandedTerms).
term_expansion_list([Term|Terms], ExpandedTermsHead, ExpandedTermsTail) :-
expand_term(Term, ExpandedTerm0),
( var(ExpandedTerm0) ->
error:instantiation_error(term_expansion/2)
; ExpandedTerm0 = [_|_] ->
term_expansion_list(ExpandedTerm0, ExpandedTermsHead, ExpandedTerms0Tail),
term_expansion_list(Terms, ExpandedTerms0Tail, ExpandedTermsTail)
; ExpandedTermsHead = [ExpandedTerm0 | ExpandedTerms0Tail],
term_expansion_list(Terms, ExpandedTerms0Tail, ExpandedTermsTail)
).
goal_expansion(Goal, Module, ExpandedGoal) :-
( atom(Module),
'$predicate_defined'(Module, goal_expansion, 2),
catch('$call'(Module:goal_expansion(Goal, ExpandedGoal0)),
E,
'$call'(loader:'$print_message_and_fail'(E))) ->
( var(ExpandedGoal0) ->
error:instantiation_error(goal_expansion/2)
; goal_expansion(ExpandedGoal0, Module, ExpandedGoal)
)
; Goal = ExpandedGoal
).
create_file_load_context(Stream, Path, Evacuable) :-
'$push_load_context'(Stream, Path),
'$push_load_state_payload'(Evacuable).
create_load_context(Stream, Evacuable) :-
'$push_load_context'(Stream, ''),
'$push_load_state_payload'(Evacuable).
unload_evacuable(Evacuable) :-
'$pop_load_state_payload'(Evacuable),
'$pop_load_context'.
run_initialization_goals(Module) :-
( predicate_property(Module:'$initialization_goals'(_), dynamic) ->
% FIXME: failing here. also, see add_module.
findall(Module:Goal, '$call'(builtins:retract(Module:'$initialization_goals'(Goal))), Goals),
abolish(Module:'$initialization_goals'/1),
maplist(loader:success_or_warning, Goals)
; true
).
success_or_warning(Goal) :-
( call(Goal) ->
true
; %% initialization goals can fail without thwarting the load.
write('Warning: initialization/1 failed for: '),
writeq(Goal),
nl
).
run_initialization_goals :-
prolog_load_context(module, Module),
run_initialization_goals(user),
( Module \== user ->
run_initialization_goals(Module)
; true
).
file_load(Stream, Path) :-
file_load(Stream, Path, _),
false. %% Clear the heap.
file_load(_, _).
file_load(Stream, Path, Evacuable) :-
create_file_load_context(Stream, Path, Evacuable),
% '$add_in_situ_filename_module' removes user level predicates,
% local predicate clauses, etc. from a previous load of the file
% at Path.
'$add_in_situ_filename_module'(Evacuable),
catch((loader:load_loop(Stream, Evacuable),
loader:run_initialization_goals),
E,
builtins:(loader:unload_evacuable(Evacuable),
loader:'$print_message_and_fail'(E),
builtins:throw(E))),
'$pop_load_context'.
load(Stream) :-
create_load_context(Stream, Evacuable),
catch((loader:load_loop(Stream, Evacuable),
loader:run_initialization_goals),
E,
builtins:(loader:unload_evacuable(Evacuable),
loader:'$print_message_and_fail'(E),
builtins:throw(E))),
'$pop_load_context',
false. %% Clear the heap.
load(_).
print_comma_separated_list([VN=_]) :-
write(VN),
!.
print_comma_separated_list([VN=_, VNEq | VNEqs]) :-
write(VN),
write(', '),
print_comma_separated_list([VNEq | VNEqs]).
filter_anonymous_vars([], []).
filter_anonymous_vars([VN=V | VNEqs0], VNEqs) :-
( atom_concat('_', _, VN) ->
filter_anonymous_vars(VNEqs0, VNEqs)
; VNEqs = [VN=V | VNEqs1],
filter_anonymous_vars(VNEqs0, VNEqs1)
).
warn_about_singletons([], _).
warn_about_singletons([Singleton|Singletons], LinesRead) :-
( filter_anonymous_vars([Singleton|Singletons], VarEqs),
VarEqs \== [] ->
write('Warning: singleton variables '),
print_comma_separated_list(VarEqs),
write(' at line '),
write(LinesRead),
write(' of '),
prolog_load_context(file, File),
write(File),
nl
; true
).
load_loop(Stream, Evacuable) :-
( '$devour_whitespace'(Stream) ->
stream_property(Stream, position(position_and_lines_read(_, LinesRead))),
read_term(Stream, Term, [singletons(Singletons)])
; Term = end_of_file
),
( Term == end_of_file ->
close(Stream),
'$conclude_load'(Evacuable)
; var(Term) ->
instantiation_error(load/1)
; warn_about_singletons(Singletons, LinesRead),
compile_term(Term, Evacuable),
load_loop(Stream, Evacuable)
).
compile_term(Term, Evacuable) :-
expand_terms_and_goals(Term, Terms),
!,
( var(Terms) ->
instantiation_error(load/1)
; Terms = [_|_] ->
compile_dispatch_or_clause_on_list(Terms, Evacuable)
; compile_dispatch_or_clause(Terms, Evacuable)
).
inner_meta_specs(0, HeadArg, InnerHeadArgs, InnerMetaSpecs) :-
!,
predicate_property(HeadArg, meta_predicate(InnerMetaSpecs0)),
InnerMetaSpecs0 =.. [_ | InnerMetaSpecs],
HeadArg =.. [_ | InnerHeadArgs].
inner_meta_specs((:), _, [], []) :-
!.
inner_meta_specs(N, HeadArg, InnerHeadArgs, InnerMetaSpecs) :-
integer(N),
N >= 0,
HeadArg =.. [Functor | InnerHeadArgs],
length(InnerHeadArgs1, N),
append(InnerHeadArgs, InnerHeadArgs1, InnerHeadArgs0),
CompleteHeadArg =.. [Functor | InnerHeadArgs0],
predicate_property(CompleteHeadArg, meta_predicate(InnerMetaSpecs0)),
InnerMetaSpecs0 =.. [_ | InnerMetaSpecs].
module_expanded_head_variables_([], _, HeadVars, HeadVars).
module_expanded_head_variables_([HeadArg | HeadArgs], [MetaSpec | MetaSpecs], HeadVars, HeadVars0) :-
( ( MetaSpec == (:)
; integer(MetaSpec),
MetaSpec >= 0
) ->
( var(HeadArg) ->
HeadVars = [HeadArg-HeadArg | HeadVars1],
module_expanded_head_variables_(HeadArgs, MetaSpecs, HeadVars1, HeadVars0)
; inner_meta_specs(MetaSpec, HeadArg, InnerHeadArgs, InnerMetaSpecs) ->
module_expanded_head_variables_(InnerHeadArgs, InnerMetaSpecs, HeadVars, HeadVars1),
module_expanded_head_variables_(HeadArgs, MetaSpecs, HeadVars1, HeadVars0)
; module_expanded_head_variables_(HeadArgs, MetaSpecs, HeadVars, HeadVars0)
)
; module_expanded_head_variables_(HeadArgs, MetaSpecs, HeadVars, HeadVars0)
).
module_expanded_head_variables(Head, HeadVars) :-
( var(Head) ->
instantiation_error(load/1)
; predicate_property(Head, meta_predicate(MetaSpecs0)),
MetaSpecs0 =.. [_ | MetaSpecs],
Head =.. [_ | HeadArgs] ->
module_expanded_head_variables_(HeadArgs, MetaSpecs, HeadVars, [])
; HeadVars = []
).
expand_term_goals(Terms0, Terms) :-
( Terms0 = (Head1 :- Body0) ->
( var(Head1) ->
instantiation_error(load/1)
; Head1 = Module:Head2 ->
( atom(Module) ->
prolog_load_context(module, Target),
module_expanded_head_variables(Head2, HeadVars),
expand_goal(Body0, Target, Body1, HeadVars),
Terms = (Module:Head2 :- Body1)
; type_error(atom, Module, load/1)
)
; module_expanded_head_variables(Head1, HeadVars),
prolog_load_context(module, Target),
expand_goal(Body0, Target, Body1, HeadVars),
Terms = (Head1 :- Body1)
)
; Terms = Terms0
).
expand_terms_and_goals(Term, Terms) :-
expand_term(Term, Terms0),
( var(Terms0) ->
instantiation_error(load/1)
; Terms0 = [_|_] ->
maplist(loader:expand_term_goals, Terms0, Terms)
; expand_term_goals(Terms0, Terms)
).
compile_dispatch_or_clause_on_list([], Evacuable).
compile_dispatch_or_clause_on_list([Term | Terms], Evacuable) :-
compile_dispatch_or_clause(Term, Evacuable),
compile_dispatch_or_clause_on_list(Terms, Evacuable).
compile_dispatch_or_clause(Term, Evacuable) :-
( var(Term) ->
instantiation_error(load/1)
; compile_dispatch(Term, Evacuable) ->
'$flush_term_queue'(Evacuable)
; compile_clause(Term, Evacuable)
).
compile_dispatch((:- Declaration), Evacuable) :-
( var(Declaration) ->
instantiation_error(load/1)
; compile_declaration(Declaration, Evacuable)
).
compile_dispatch(term_expansion(Term, Terms), Evacuable) :-
'$add_term_expansion_clause'(term_expansion(Term, Terms), Evacuable).
compile_dispatch((term_expansion(Term, Terms) :- Body), Evacuable) :-
'$add_term_expansion_clause'((term_expansion(Term, Terms) :- Body), Evacuable).
compile_dispatch(user:term_expansion(Term, Terms), Evacuable) :-
'$add_term_expansion_clause'(term_expansion(Term, Terms), Evacuable).
compile_dispatch((user:term_expansion(Term, Terms) :- Body), Evacuable) :-
'$add_term_expansion_clause'((term_expansion(Term, Terms) :- Body), Evacuable).
compile_dispatch(goal_expansion(Term, Terms), Evacuable) :-
prolog_load_context(module, user),
'$add_goal_expansion_clause'(user, goal_expansion(Term, Terms), Evacuable).
compile_dispatch((goal_expansion(Term, Terms) :- Body), Evacuable) :-
prolog_load_context(module, user),
'$add_goal_expansion_clause'(user, (goal_expansion(Term, Terms) :- Body), Evacuable).
compile_dispatch(user:goal_expansion(Term, Terms), Evacuable) :-
'$add_goal_expansion_clause'(user, goal_expansion(Term, Terms), Evacuable).
compile_dispatch((user:goal_expansion(Term, Terms) :- Body), Evacuable) :-
'$add_goal_expansion_clause'(user, (goal_expansion(Term, Terms) :- Body), Evacuable).
remove_module(Module, Evacuable) :-
( nonvar(Module),
Module = library(ModuleName),
atom(ModuleName),
atom \== [] ->
'$remove_module_exports'(ModuleName, Evacuable)
; atom(Module),
atom \== [] ->
'$remove_module_exports'(Module, Evacuable)
; domain_error(module_specifier, Module, use_module/2)
).
compile_declaration(use_module(Module), Evacuable) :-
use_module(Module, [], Evacuable).
compile_declaration(use_module(Module, Exports), Evacuable) :-
( Exports == [] ->
remove_module(Module, Evacuable)
; use_module(Module, Exports, Evacuable)
).
compile_declaration(module(Module, Exports), Evacuable) :-
( atom(Module) ->
'$declare_module'(Module, Exports, Evacuable)
; type_error(atom, Module, load/1)
).
compile_declaration(dynamic(Module:Name/Arity), Evacuable) :-
!,
must_be(atom, Module),
must_be(atom, Name),
must_be(integer, Arity),
'$add_dynamic_predicate'(Module, Name, Arity, Evacuable).
compile_declaration(dynamic(Name/Arity), Evacuable) :-
must_be(atom, Name),
must_be(integer, Arity),
prolog_load_context(module, Module),
'$add_dynamic_predicate'(Module, Name, Arity, Evacuable).
compile_declaration(multifile(Module:Name/Arity), Evacuable) :-
!,
must_be(atom, Module),
must_be(atom, Name),
must_be(integer, Arity),
'$add_multifile_predicate'(Module, Name, Arity, Evacuable).
compile_declaration(multifile(Name/Arity), Evacuable) :-
must_be(atom, Name),
must_be(integer, Arity),
prolog_load_context(module, Module),
'$add_multifile_predicate'(Module, Name, Arity, Evacuable).
compile_declaration(discontiguous(Module:Name/Arity), Evacuable) :-
!,
must_be(atom, Module),
must_be(atom, Name),
must_be(integer, Arity),
'$add_discontiguous_predicate'(Module, Name, Arity, Evacuable).
compile_declaration(discontiguous(Name/Arity), Evacuable) :-
must_be(atom, Name),
must_be(integer, Arity),
prolog_load_context(module, Module),
'$add_discontiguous_predicate'(Module, Name, Arity, Evacuable).
compile_declaration(initialization(Goal), Evacuable) :-
prolog_load_context(module, Module),
assertz(Module:'$initialization_goals'(Goal)).
compile_declaration(set_prolog_flag(Flag, Value), _) :-
set_prolog_flag(Flag, Value).
compile_declaration(non_counted_backtracking(Name/Arity), Evacuable) :-
must_be(atom, Name),
must_be(integer, Arity),
( Arity >= 0 ->
'$add_non_counted_backtracking'(Name, Arity, Evacuable)
; domain_error(not_less_than_zero, Arity, load/1)
).
compile_clause((Target:Head :- Body), Evacuable) :-
!,
functor(Head, Name, Arity),
( '$is_consistent_with_term_queue'(Target, Name, Arity, Evacuable) ->
'$scoped_clause_to_evacuable'(Target, (Head :- Body), Evacuable)
; '$flush_term_queue'(Evacuable),
compile_term((Target:Head :- Body), Evacuable)
).
compile_clause(Target:Head, Evacuable) :-
!,
functor(Head, Name, Arity),
( '$is_consistent_with_term_queue'(Target, Name, Arity, Evacuable) ->
'$scoped_clause_to_evacuable'(Target, Head, Evacuable)
; '$flush_term_queue'(Evacuable),
compile_term(Target:Head, Evacuable)
).
compile_clause((Head :- Body), Evacuable) :-
!,
prolog_load_context(module, Target),
functor(Head, Name, Arity),
( '$is_consistent_with_term_queue'(Target, Name, Arity, Evacuable) ->
'$clause_to_evacuable'((Head :- Body), Evacuable)
; '$flush_term_queue'(Evacuable),
compile_term((Head :- Body), Evacuable)
).
compile_clause(Head, Evacuable) :-
prolog_load_context(module, Target),
functor(Head, Name, Arity),
( '$is_consistent_with_term_queue'(Target, Name, Arity, Evacuable) ->
'$clause_to_evacuable'(Head, Evacuable)
; '$flush_term_queue'(Evacuable),
compile_term(Head, Evacuable)
).
prolog_load_context(source, Source) :-
%% The absolute path name of the file being compiled. During
%% loading of a PO file, the corresponding source file name is
%% returned.
'$prolog_lc_source'(Source).
prolog_load_context(file, File) :-
%% Outside included files (see Include Declarations) this is the
%% same as the source key. In included files this is the absolute
%% path name of the file being included.
'$prolog_lc_file'(File).
prolog_load_context(directory, Dir) :-
%% The absolute path name of the directory of the file being
%% compiled/loaded. In included files this is the directory of the
%% file being included.
'$prolog_lc_dir'(Dir).
prolog_load_context(module, Module) :-
%% The source module (see ref-mod-mne). This is useful for example
%% if you are defining clauses for user:term_expansion/6 and need
%% to access the source module at compile time.
'$prolog_lc_module'(Module).
prolog_load_context(stream, Stream) :-
%% The stream being compiled or loaded from.
'$prolog_lc_stream'(Stream).
prolog_load_context(term_position, TermPosition) :-
%% TermPosition represents the stream position of the last term read.
'$prolog_lc_stream'(Stream),
stream_property(Stream, position(TermPosition)).
consult(Item) :-
( atom(Item) -> use_module(Item)
; type_error(atom, Item, consult/1)
).
use_module(Module) :-
'$push_load_state_payload'(Evacuable),
use_module(Module, [], Evacuable).
use_module(Module, Exports) :-
'$push_load_state_payload'(Evacuable),
( Exports == [] ->
remove_module(Module, Evacuable)
; use_module(Module, Exports, Evacuable)
).
current_module(Module) :-
( var(Module) ->
instantiation_error(current_module/1)
; \+ atom(Module) ->
type_error(atom, Module, current_module/1)
; '$module_exists'(Module)
).
%% If use_module is invoked in an existing load context, use its
%% directory. Otherwise, use the relative path of Path.
load_context_path(Module, Path) :-
( sub_atom(Module, 0, 1, _, '/') ->
Path = Module
; prolog_load_context(directory, CurrentDir) ->
% Rust's Path module never ends a directory path with '/', so
% add one here.
atom_concat(CurrentDir, '/', CurrentDirSlashed),
atom_concat(CurrentDirSlashed, Module, Path)
; Module = Path
).
path_atom(Dir/File, Path) :-
must_be(atom, File),
!,
path_atom(Dir, DirPath),
foldl(builtins:atom_concat, ['/', DirPath], File, Path).
path_atom(Path, Path) :-
must_be(atom, Path).
% Try to open the file with the Path name as given; if that fails,
% append '.pl' and try again.
open_file(Path, Stream) :-
( atom_concat(_, '.pl', Path) ->
open(Path, read, Stream)
; catch(open(Path, read, Stream),
error(existence_error(source_sink, _), _),
( atom_concat(Path, '.pl', ExtendedPath),
open(ExtendedPath, read, Stream)
)
)
).
use_module(Module, Exports, Evacuable) :-
( var(Module) ->
instantiation_error(load/1)
; Module = library(Library) ->
( path_atom(Library, LibraryPath) ->
( '$load_compiled_library'(LibraryPath, Exports, Evacuable) ->
true
; '$load_library_as_stream'(LibraryPath, Stream, Path),
file_load(Stream, Path, Subevacuable),
'$use_module'(Evacuable, Subevacuable, Exports)
)
; var(Library) ->
instantiation_error(load/1)
; type_error(atom, Library, load/1)
)
; ( path_atom(Module, ModulePath) ->
load_context_path(ModulePath, Path),
open_file(Path, Stream),
stream_property(Stream, file_name(PathFileName)),
file_load(Stream, PathFileName, Subevacuable),
'$use_module'(Evacuable, Subevacuable, Exports)
; type_error(atom, Library, load/1)
)
).
check_predicate_property(meta_predicate, Module, Name, Arity, MetaPredicateTerm) :-
'$meta_predicate_property'(Module, Name, Arity, MetaPredicateTerm).
check_predicate_property(built_in, _, Name, Arity, built_in) :-
'$built_in_property'(Name, Arity).
check_predicate_property(dynamic, Module, Name, Arity, dynamic) :-
'$dynamic_property'(Module, Name, Arity).
check_predicate_property(multifile, Module, Name, Arity, multifile) :-
'$multifile_property'(Module, Name, Arity).
check_predicate_property(discontiguous, Module, Name, Arity, discontiguous) :-
'$discontiguous_property'(Module, Name, Arity).
extract_predicate_property(Property, PropertyType) :-
( var(Property) ->
true
; functor(Property, PropertyType, _)
).
load_context(Module) :-
( prolog_load_context(module, Module) ->
true
; Module = user
).
predicate_property(Callable, Property) :-
( var(Callable) ->
instantiation_error(predicate_property/2)
; functor(Callable, (:), 2),
arg(1, Callable, Module),
arg(2, Callable, Callable0),
atom(Module),
nonvar(Callable0) ->
functor(Callable0, Name, Arity),
( atom(Name) ->
extract_predicate_property(Property, PropertyType),
check_predicate_property(PropertyType, Module, Name, Arity, Property)
; type_error(callable, Callable0, predicate_property/2)
)
; functor(Callable, Name, Arity),
( atom(Name) ->
extract_predicate_property(Property, PropertyType),
load_context(Module),
check_predicate_property(PropertyType, Module, Name, Arity, Property)
; type_error(callable, Callable, predicate_property/2)
)
).
strip_module(Goal, M, G) :-
'$strip_module'(Goal, M, G).
:- non_counted_backtracking expand_subgoal/5.
expand_subgoal(UnexpandedGoals, MS, Module, ExpandedGoals, HeadVars) :-
( var(UnexpandedGoals) ->
UnexpandedGoals = ExpandedGoals
; ( MS == 0 ->
% only expand complete goals. call/N will take care of incomplete goals
% by calling goal expansion after it is supplied the remaining arguments.
( goal_expansion(UnexpandedGoals, Module, UnexpandedGoals1),
( Module \== user ->
goal_expansion(UnexpandedGoals1, user, Goals)
; Goals = UnexpandedGoals1
)
)
; Goals = UnexpandedGoals
),
( inner_meta_specs(MS, Goals, _, MetaSpecs) ->
expand_module_names(Goals, MetaSpecs, Module, ExpandedGoals, HeadVars)
; Goals = ExpandedGoals
)
; UnexpandedGoals = ExpandedGoals
).
:- non_counted_backtracking expand_module_name/4.
expand_module_name(ESG0, MS, M, ESG) :-
( var(ESG0) ->
ESG = M:ESG0
; ESG0 = _:_ ->
ESG = ESG0
; functor(ESG0, F, A0),
integer(MS),
A is A0 + MS,
functor(EESG0, F, A),
predicate_property(EESG0, built_in) ->
ESG = ESG0
; ESG = M:ESG0
).
:- non_counted_backtracking expand_meta_predicate_subgoals/5.
expand_meta_predicate_subgoals([SG | SGs], [MS | MSs], M, [ESG | ESGs], HeadVars) :-
( ( integer(MS),
MS >= 0
; MS == (:)
) ->
( var(SG),
pairs:same_key(SG, HeadVars, [_|_], _) ->
expand_subgoal(SG, MS, M, ESG, HeadVars)
; expand_subgoal(SG, MS, M, ESG0, HeadVars),
expand_module_name(ESG0, MS, M, ESG)
),
expand_meta_predicate_subgoals(SGs, MSs, M, ESGs, HeadVars)
; ESG = SG,
expand_meta_predicate_subgoals(SGs, MSs, M, ESGs, HeadVars)
).
expand_meta_predicate_subgoals([], _, _, [], _).
:- non_counted_backtracking expand_module_names/5.
expand_module_names(Goals, MetaSpecs, Module, ExpandedGoals, HeadVars) :-
Goals =.. [GoalFunctor | SubGoals],
( GoalFunctor == (:),
SubGoals = [M, SubGoal] ->
expand_module_names(SubGoal, MetaSpecs, M, ExpandedSubGoal, HeadVars),
expand_module_name(ExpandedSubGoal, 0, M, ExpandedGoals)
; expand_meta_predicate_subgoals(SubGoals, MetaSpecs, Module, ExpandedGoalList, HeadVars),
ExpandedGoals =.. [GoalFunctor | ExpandedGoalList]
).
:- non_counted_backtracking expand_goal/3.
expand_goal(UnexpandedGoals, Module, ExpandedGoals) :-
% if a goal isn't callable, defer to call/N to report the error.
catch('$call'(loader:expand_goal(UnexpandedGoals, Module, ExpandedGoals, [])),
error(type_error(callable, _), _),
'$call'(UnexpandedGoals = ExpandedGoals)),
!.
:- non_counted_backtracking expand_goal/4.
expand_goal(UnexpandedGoals, Module, ExpandedGoals, HeadVars) :-
( var(UnexpandedGoals) ->
expand_module_names(call(UnexpandedGoals), [0], Module, ExpandedGoals, HeadVars)
; goal_expansion(UnexpandedGoals, Module, UnexpandedGoals1),
( Module \== user ->
goal_expansion(UnexpandedGoals1, user, Goals)
; Goals = UnexpandedGoals1
),
( expand_goal_cases(Goals, Module, ExpandedGoals, HeadVars) ->
true
; predicate_property(Module:Goals, meta_predicate(MetaSpecs0)),
MetaSpecs0 =.. [_ | MetaSpecs] ->
expand_module_names(Goals, MetaSpecs, Module, ExpandedGoals, HeadVars)
; thread_goals(Goals, ExpandedGoals, (','))
; Goals = ExpandedGoals
)
).
:- non_counted_backtracking expand_goal_cases/4.
expand_goal_cases((Goal0, Goals0), Module, ExpandedGoals, HeadVars) :-
( expand_goal(Goal0, Module, Goal1, HeadVars) ->
expand_goal(Goals0, Module, Goals1, HeadVars),
thread_goals(Goal1, ExpandedGoals, Goals1, (','))
; expand_goal(Goals0, Module, Goals1, HeadVars),
ExpandedGoals = (Goal0, Goals1)
).
expand_goal_cases((Goals0 -> Goals1), Module, ExpandedGoals, HeadVars) :-
expand_goal(Goals0, Module, ExpandedGoals0, HeadVars),
expand_goal(Goals1, Module, ExpandedGoals1, HeadVars),
ExpandedGoals = (ExpandedGoals0 -> ExpandedGoals1).
expand_goal_cases((Goals0 ; Goals1), Module, ExpandedGoals, HeadVars) :-
expand_goal(Goals0, Module, ExpandedGoals0, HeadVars),
expand_goal(Goals1, Module, ExpandedGoals1, HeadVars),
ExpandedGoals = (ExpandedGoals0 ; ExpandedGoals1).
expand_goal_cases((\+ Goals0), Module, ExpandedGoals, HeadVars) :-
expand_goal(Goals0, Module, Goals1, HeadVars),
ExpandedGoals = (\+ Goals1).
expand_goal_cases((Module:Goals0), _, ExpandedGoals, HeadVars) :-
expand_goal(Goals0, Module, Goals1, HeadVars),
ExpandedGoals = (Module:Goals1).
:- non_counted_backtracking thread_goals/3.
thread_goals(Goals0, Goals1, Functor) :-
( var(Goals0) ->
Goals0 = Goals1
; Goals0 = [G | Gs] ->
( Gs = [] ->
Goals1 = G
; Goals1 =.. [Functor, G, Goals2],
thread_goals(Gs, Goals2, Functor)
)
; Goals1 = Goals0
).
:- non_counted_backtracking thread_goals/4.
thread_goals(Goals0, Goals1, Hole, Functor) :-
( var(Goals0) ->
Goals1 =.. [Functor, Goals0, Hole]
; Goals0 = [G | Gs] ->
( Gs == [] ->
Goals1 =.. [Functor, G, Hole]
; Goals1 =.. [Functor, G, Goals2],
thread_goals(Gs, Goals2, Hole, Functor)
)
; Goals1 =.. [Functor, Goals0, Hole]
).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% call/{1-64} with dynamic goal expansion.
%
% The program used to generate the call/N predicates:
%
%
%
% :- use_module(library(between)).
% :- use_module(library(error)).
% :- use_module(library(lists)).
% :- use_module(library(format)).
%
% n_call_clause(N, Clause) :-
% length(Args, N),
% Head =.. [call, G | Args],
% N1 is N + 1,
% CallClause0 =.. ['$prepare_call_clause', G1, M, G0 | Args],
% CallClause =.. ['$prepare_call_clause', G1, M, G | Args],
% Clause = (Head :- ( var(G) ->
% instantiation_error(call/N1)
% ; G = '$call'(G0) ->
% CallClause0,
% '$call_with_inference_counting'('$call'(M:G1))
% ; CallClause,
% expand_goal(call(M:G1), M, call(G2)),
% '$call_with_inference_counting'('$call'(G2))
% )
% ).
%
% generate_call_forms :-
% between(1, 64, N),
% n_call_clause(N, Clause),
% N1 is N+1,
% portray_clause((:- non_counted_backtracking call/N1)),
% portray_clause(Clause),
% nl,
% false.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% The '$call' functor is an escape hatch from goal expansion. So far,
% it is used only to avoid infinite recursion into expand_goal/3.
:- non_counted_backtracking call/1.
call(G) :-
( var(G) ->
instantiation_error(call/1)
; G = '$call'(G0) ->
'$prepare_call_clause'(G1, M, G0),
'$call_with_inference_counting'('$call'(M:G1))
; '$prepare_call_clause'(G1, M, G),
expand_goal(call(M:G1), M, call(G2)),
'$call_with_inference_counting'('$call'(G2))
).
:-non_counted_backtracking call/2.
call(A,B) :-
( var(A) ->
instantiation_error(call/2)
; A= '$call'(C) ->
'$prepare_call_clause'(D,E,C,B),
'$call_with_inference_counting'('$call'(E:D))
; '$prepare_call_clause'(D,E,A,B),
expand_goal(call(E:D),E,call(F)),
'$call_with_inference_counting'('$call'(F))
).
:-non_counted_backtracking call/3.
call(A,B,C) :-
( var(A) ->
instantiation_error(call/3)
; A= '$call'(D) ->
'$prepare_call_clause'(E,F,D,B,C),
'$call_with_inference_counting'('$call'(F:E))
; '$prepare_call_clause'(E,F,A,B,C),
expand_goal(call(F:E),F,call(G)),
'$call_with_inference_counting'('$call'(G))
).
:-non_counted_backtracking call/4.
call(A,B,C,D) :-
( var(A) ->
instantiation_error(call/4)
; A= '$call'(E) ->
'$prepare_call_clause'(F,G,E,B,C,D),
'$call_with_inference_counting'('$call'(G:F))
; '$prepare_call_clause'(F,G,A,B,C,D),
expand_goal(call(G:F),G,call(H)),
'$call_with_inference_counting'('$call'(H))
).
:-non_counted_backtracking call/5.
call(A,B,C,D,E) :-
( var(A) ->
instantiation_error(call/5)
; A= '$call'(F) ->
'$prepare_call_clause'(G,H,F,B,C,D,E),
'$call_with_inference_counting'('$call'(H:G))
; '$prepare_call_clause'(G,H,A,B,C,D,E),
expand_goal(call(H:G),H,call(I)),
'$call_with_inference_counting'('$call'(I))
).
:-non_counted_backtracking call/6.
call(A,B,C,D,E,F) :-
( var(A) ->
instantiation_error(call/6)
; A= '$call'(G) ->
'$prepare_call_clause'(H,I,G,B,C,D,E,F),
'$call_with_inference_counting'('$call'(I:H))
; '$prepare_call_clause'(H,I,A,B,C,D,E,F),
expand_goal(call(I:H),I,call(J)),
'$call_with_inference_counting'('$call'(J))
).
:-non_counted_backtracking call/7.
call(A,B,C,D,E,F,G) :-
( var(A) ->
instantiation_error(call/7)
; A= '$call'(H) ->
'$prepare_call_clause'(I,J,H,B,C,D,E,F,G),
'$call_with_inference_counting'('$call'(J:I))
; '$prepare_call_clause'(I,J,A,B,C,D,E,F,G),
expand_goal(call(J:I),J,call(K)),
'$call_with_inference_counting'('$call'(K))
).
:-non_counted_backtracking call/8.
call(A,B,C,D,E,F,G,H) :-
( var(A) ->
instantiation_error(call/8)
; A= '$call'(I) ->
'$prepare_call_clause'(J,K,I,B,C,D,E,F,G,H),
'$call_with_inference_counting'('$call'(K:J))
; '$prepare_call_clause'(J,K,A,B,C,D,E,F,G,H),
expand_goal(call(K:J),K,call(L)),
'$call_with_inference_counting'('$call'(L))
).
:-non_counted_backtracking call/9.
call(A,B,C,D,E,F,G,H,I) :-
( var(A) ->
instantiation_error(call/9)
; A= '$call'(J) ->
'$prepare_call_clause'(K,L,J,B,C,D,E,F,G,H,I),
'$call_with_inference_counting'('$call'(L:K))
; '$prepare_call_clause'(K,L,A,B,C,D,E,F,G,H,I),
expand_goal(call(L:K),L,call(M)),
'$call_with_inference_counting'('$call'(M))
).
:-non_counted_backtracking call/10.
call(A,B,C,D,E,F,G,H,I,J) :-
( var(A) ->
instantiation_error(call/10)
; A= '$call'(K) ->
'$prepare_call_clause'(L,M,K,B,C,D,E,F,G,H,I,J),
'$call_with_inference_counting'('$call'(M:L))
; '$prepare_call_clause'(L,M,A,B,C,D,E,F,G,H,I,J),
expand_goal(call(M:L),M,call(N)),
'$call_with_inference_counting'('$call'(N))
).
:-non_counted_backtracking call/11.
call(A,B,C,D,E,F,G,H,I,J,K) :-
( var(A) ->
instantiation_error(call/11)
; A= '$call'(L) ->
'$prepare_call_clause'(M,N,L,B,C,D,E,F,G,H,I,J,K),
'$call_with_inference_counting'('$call'(N:M))
; '$prepare_call_clause'(M,N,A,B,C,D,E,F,G,H,I,J,K),
expand_goal(call(N:M),N,call(O)),
'$call_with_inference_counting'('$call'(O))
).
:-non_counted_backtracking call/12.
call(A,B,C,D,E,F,G,H,I,J,K,L) :-
( var(A) ->
instantiation_error(call/12)
; A= '$call'(M) ->
'$prepare_call_clause'(N,O,M,B,C,D,E,F,G,H,I,J,K,L),
'$call_with_inference_counting'('$call'(O:N))
; '$prepare_call_clause'(N,O,A,B,C,D,E,F,G,H,I,J,K,L),
expand_goal(call(O:N),O,call(P)),
'$call_with_inference_counting'('$call'(P))
).
:-non_counted_backtracking call/13.
call(A,B,C,D,E,F,G,H,I,J,K,L,M) :-
( var(A) ->
instantiation_error(call/13)
; A= '$call'(N) ->
'$prepare_call_clause'(O,P,N,B,C,D,E,F,G,H,I,J,K,L,M),
'$call_with_inference_counting'('$call'(P:O))
; '$prepare_call_clause'(O,P,A,B,C,D,E,F,G,H,I,J,K,L,M),
expand_goal(call(P:O),P,call(Q)),
'$call_with_inference_counting'('$call'(Q))
).
:-non_counted_backtracking call/14.
call(A,B,C,D,E,F,G,H,I,J,K,L,M,N) :-
( var(A) ->
instantiation_error(call/14)
; A= '$call'(O) ->
'$prepare_call_clause'(P,Q,O,B,C,D,E,F,G,H,I,J,K,L,M,N),
'$call_with_inference_counting'('$call'(Q:P))
; '$prepare_call_clause'(P,Q,A,B,C,D,E,F,G,H,I,J,K,L,M,N),
expand_goal(call(Q:P),Q,call(R)),
'$call_with_inference_counting'('$call'(R))
).
:-non_counted_backtracking call/15.
call(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O) :-
( var(A) ->
instantiation_error(call/15)
; A= '$call'(P) ->
'$prepare_call_clause'(Q,R,P,B,C,D,E,F,G,H,I,J,K,L,M,N,O),
'$call_with_inference_counting'('$call'(R:Q))
; '$prepare_call_clause'(Q,R,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O),
expand_goal(call(R:Q),R,call(S)),
'$call_with_inference_counting'('$call'(S))
).
:-non_counted_backtracking call/16.
call(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P) :-
( var(A) ->
instantiation_error(call/16)
; A= '$call'(Q) ->
'$prepare_call_clause'(R,S,Q,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P),
'$call_with_inference_counting'('$call'(S:R))
; '$prepare_call_clause'(R,S,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P),
expand_goal(call(S:R),S,call(T)),
'$call_with_inference_counting'('$call'(T))
).
:-non_counted_backtracking call/17.
call(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q) :-
( var(A) ->
instantiation_error(call/17)
; A= '$call'(R) ->
'$prepare_call_clause'(S,T,R,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q),
'$call_with_inference_counting'('$call'(T:S))
; '$prepare_call_clause'(S,T,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q),
expand_goal(call(T:S),T,call(U)),
'$call_with_inference_counting'('$call'(U))
).
:-non_counted_backtracking call/18.
call(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R) :-
( var(A) ->
instantiation_error(call/18)
; A= '$call'(S) ->
'$prepare_call_clause'(T,U,S,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R),
'$call_with_inference_counting'('$call'(U:T))
; '$prepare_call_clause'(T,U,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R),
expand_goal(call(U:T),U,call(V)),
'$call_with_inference_counting'('$call'(V))
).
:-non_counted_backtracking call/19.
call(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S) :-
( var(A) ->
instantiation_error(call/19)
; A= '$call'(T) ->
'$prepare_call_clause'(U,V,T,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S),
'$call_with_inference_counting'('$call'(V:U))
; '$prepare_call_clause'(U,V,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S),
expand_goal(call(V:U),V,call(W)),
'$call_with_inference_counting'('$call'(W))
).
:-non_counted_backtracking call/20.
call(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T) :-
( var(A) ->
instantiation_error(call/20)
; A= '$call'(U) ->
'$prepare_call_clause'(V,W,U,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T),
'$call_with_inference_counting'('$call'(W:V))
; '$prepare_call_clause'(V,W,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T),
expand_goal(call(W:V),W,call(X)),
'$call_with_inference_counting'('$call'(X))
).
:-non_counted_backtracking call/21.
call(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U) :-
( var(A) ->
instantiation_error(call/21)
; A= '$call'(V) ->
'$prepare_call_clause'(W,X,V,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U),
'$call_with_inference_counting'('$call'(X:W))
; '$prepare_call_clause'(W,X,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U),
expand_goal(call(X:W),X,call(Y)),
'$call_with_inference_counting'('$call'(Y))
).
:-non_counted_backtracking call/22.
call(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V) :-
( var(A) ->
instantiation_error(call/22)
; A= '$call'(W) ->
'$prepare_call_clause'(X,Y,W,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V),
'$call_with_inference_counting'('$call'(Y:X))
; '$prepare_call_clause'(X,Y,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V),
expand_goal(call(Y:X),Y,call(Z)),
'$call_with_inference_counting'('$call'(Z))
).
:-non_counted_backtracking call/23.
call(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W) :-
( var(A) ->
instantiation_error(call/23)
; A= '$call'(X) ->
'$prepare_call_clause'(Y,Z,X,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W),
'$call_with_inference_counting'('$call'(Z:Y))
; '$prepare_call_clause'(Y,Z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W),
expand_goal(call(Z:Y),Z,call(A1)),
'$call_with_inference_counting'('$call'(A1))
).
:-non_counted_backtracking call/24.
call(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X) :-
( var(A) ->
instantiation_error(call/24)
; A= '$call'(Y) ->
'$prepare_call_clause'(Z,A1,Y,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X),
'$call_with_inference_counting'('$call'(A1:Z))
; '$prepare_call_clause'(Z,A1,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X),
expand_goal(call(A1:Z),A1,call(B1)),
'$call_with_inference_counting'('$call'(B1))
).
:-non_counted_backtracking call/25.
call(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y) :-
( var(A) ->
instantiation_error(call/25)
; A= '$call'(Z) ->
'$prepare_call_clause'(A1,B1,Z,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y),
'$call_with_inference_counting'('$call'(B1:A1))
; '$prepare_call_clause'(A1,B1,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y),
expand_goal(call(B1:A1),B1,call(C1)),
'$call_with_inference_counting'('$call'(C1))
).
:-non_counted_backtracking call/26.
call(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z) :-
( var(A) ->
instantiation_error(call/26)
; A= '$call'(A1) ->
'$prepare_call_clause'(B1,C1,A1,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z),
'$call_with_inference_counting'('$call'(C1:B1))
; '$prepare_call_clause'(B1,C1,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z),
expand_goal(call(C1:B1),C1,call(D1)),
'$call_with_inference_counting'('$call'(D1))
).
:-non_counted_backtracking call/27.
call(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1) :-
( var(A) ->
instantiation_error(call/27)
; A= '$call'(B1) ->
'$prepare_call_clause'(C1,D1,B1,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1),
'$call_with_inference_counting'('$call'(D1:C1))
; '$prepare_call_clause'(C1,D1,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1),
expand_goal(call(D1:C1),D1,call(E1)),
'$call_with_inference_counting'('$call'(E1))
).
:-non_counted_backtracking call/28.
call(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1) :-
( var(A) ->
instantiation_error(call/28)
; A= '$call'(C1) ->
'$prepare_call_clause'(D1,E1,C1,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1),
'$call_with_inference_counting'('$call'(E1:D1))
; '$prepare_call_clause'(D1,E1,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1),
expand_goal(call(E1:D1),E1,call(F1)),
'$call_with_inference_counting'('$call'(F1))
).
:-non_counted_backtracking call/29.
call(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1) :-
( var(A) ->
instantiation_error(call/29)
; A= '$call'(D1) ->
'$prepare_call_clause'(E1,F1,D1,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1),
'$call_with_inference_counting'('$call'(F1:E1))
; '$prepare_call_clause'(E1,F1,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1),
expand_goal(call(F1:E1),F1,call(G1)),
'$call_with_inference_counting'('$call'(G1))
).
:-non_counted_backtracking call/30.
call(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1) :-
( var(A) ->
instantiation_error(call/30)
; A= '$call'(E1) ->
'$prepare_call_clause'(F1,G1,E1,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1),
'$call_with_inference_counting'('$call'(G1:F1))
; '$prepare_call_clause'(F1,G1,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1),
expand_goal(call(G1:F1),G1,call(H1)),
'$call_with_inference_counting'('$call'(H1))
).
:-non_counted_backtracking call/31.
call(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1) :-
( var(A) ->
instantiation_error(call/31)
; A= '$call'(F1) ->
'$prepare_call_clause'(G1,H1,F1,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1),
'$call_with_inference_counting'('$call'(H1:G1))
; '$prepare_call_clause'(G1,H1,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1),
expand_goal(call(H1:G1),H1,call(I1)),
'$call_with_inference_counting'('$call'(I1))
).
:-non_counted_backtracking call/32.
call(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1) :-
( var(A) ->
instantiation_error(call/32)
; A= '$call'(G1) ->
'$prepare_call_clause'(H1,I1,G1,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1),
'$call_with_inference_counting'('$call'(I1:H1))
; '$prepare_call_clause'(H1,I1,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1),
expand_goal(call(I1:H1),I1,call(J1)),
'$call_with_inference_counting'('$call'(J1))
).
:-non_counted_backtracking call/33.
call(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1) :-
( var(A) ->
instantiation_error(call/33)
; A= '$call'(H1) ->
'$prepare_call_clause'(I1,J1,H1,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1),
'$call_with_inference_counting'('$call'(J1:I1))
; '$prepare_call_clause'(I1,J1,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1),
expand_goal(call(J1:I1),J1,call(K1)),
'$call_with_inference_counting'('$call'(K1))
).
:-non_counted_backtracking call/34.
call(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1) :-
( var(A) ->
instantiation_error(call/34)
; A= '$call'(I1) ->
'$prepare_call_clause'(J1,K1,I1,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1),
'$call_with_inference_counting'('$call'(K1:J1))
; '$prepare_call_clause'(J1,K1,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1),
expand_goal(call(K1:J1),K1,call(L1)),
'$call_with_inference_counting'('$call'(L1))
).
:-non_counted_backtracking call/35.
call(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1) :-
( var(A) ->
instantiation_error(call/35)
; A= '$call'(J1) ->
'$prepare_call_clause'(K1,L1,J1,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1),
'$call_with_inference_counting'('$call'(L1:K1))
; '$prepare_call_clause'(K1,L1,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1),
expand_goal(call(L1:K1),L1,call(M1)),
'$call_with_inference_counting'('$call'(M1))
).
:-non_counted_backtracking call/36.
call(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1) :-
( var(A) ->
instantiation_error(call/36)
; A= '$call'(K1) ->
'$prepare_call_clause'(L1,M1,K1,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1),
'$call_with_inference_counting'('$call'(M1:L1))
; '$prepare_call_clause'(L1,M1,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1),
expand_goal(call(M1:L1),M1,call(N1)),
'$call_with_inference_counting'('$call'(N1))
).
:-non_counted_backtracking call/37.
call(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1) :-
( var(A) ->
instantiation_error(call/37)
; A= '$call'(L1) ->
'$prepare_call_clause'(M1,N1,L1,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1),
'$call_with_inference_counting'('$call'(N1:M1))
; '$prepare_call_clause'(M1,N1,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1),
expand_goal(call(N1:M1),N1,call(O1)),
'$call_with_inference_counting'('$call'(O1))
).
:-non_counted_backtracking call/38.
call(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1) :-
( var(A) ->
instantiation_error(call/38)
; A= '$call'(M1) ->
'$prepare_call_clause'(N1,O1,M1,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1),
'$call_with_inference_counting'('$call'(O1:N1))
; '$prepare_call_clause'(N1,O1,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1),
expand_goal(call(O1:N1),O1,call(P1)),
'$call_with_inference_counting'('$call'(P1))
).
:-non_counted_backtracking call/39.
call(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1) :-
( var(A) ->
instantiation_error(call/39)
; A= '$call'(N1) ->
'$prepare_call_clause'(O1,P1,N1,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1),
'$call_with_inference_counting'('$call'(P1:O1))
; '$prepare_call_clause'(O1,P1,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1),
expand_goal(call(P1:O1),P1,call(Q1)),
'$call_with_inference_counting'('$call'(Q1))
).
:-non_counted_backtracking call/40.
call(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1) :-
( var(A) ->
instantiation_error(call/40)
; A= '$call'(O1) ->
'$prepare_call_clause'(P1,Q1,O1,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1),
'$call_with_inference_counting'('$call'(Q1:P1))
; '$prepare_call_clause'(P1,Q1,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1),
expand_goal(call(Q1:P1),Q1,call(R1)),
'$call_with_inference_counting'('$call'(R1))
).
:-non_counted_backtracking call/41.
call(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1) :-
( var(A) ->
instantiation_error(call/41)
; A= '$call'(P1) ->
'$prepare_call_clause'(Q1,R1,P1,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1),
'$call_with_inference_counting'('$call'(R1:Q1))
; '$prepare_call_clause'(Q1,R1,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1),
expand_goal(call(R1:Q1),R1,call(S1)),
'$call_with_inference_counting'('$call'(S1))
).
:-non_counted_backtracking call/42.
call(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1) :-
( var(A) ->
instantiation_error(call/42)
; A= '$call'(Q1) ->
'$prepare_call_clause'(R1,S1,Q1,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1),
'$call_with_inference_counting'('$call'(S1:R1))
; '$prepare_call_clause'(R1,S1,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1),
expand_goal(call(S1:R1),S1,call(T1)),
'$call_with_inference_counting'('$call'(T1))
).
:-non_counted_backtracking call/43.
call(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1) :-
( var(A) ->
instantiation_error(call/43)
; A= '$call'(R1) ->
'$prepare_call_clause'(S1,T1,R1,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1),
'$call_with_inference_counting'('$call'(T1:S1))
; '$prepare_call_clause'(S1,T1,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1),
expand_goal(call(T1:S1),T1,call(U1)),
'$call_with_inference_counting'('$call'(U1))
).
:-non_counted_backtracking call/44.
call(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1) :-
( var(A) ->
instantiation_error(call/44)
; A= '$call'(S1) ->
'$prepare_call_clause'(T1,U1,S1,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1),
'$call_with_inference_counting'('$call'(U1:T1))
; '$prepare_call_clause'(T1,U1,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1),
expand_goal(call(U1:T1),U1,call(V1)),
'$call_with_inference_counting'('$call'(V1))
).
:-non_counted_backtracking call/45.
call(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1) :-
( var(A) ->
instantiation_error(call/45)
; A= '$call'(T1) ->
'$prepare_call_clause'(U1,V1,T1,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1),
'$call_with_inference_counting'('$call'(V1:U1))
; '$prepare_call_clause'(U1,V1,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1),
expand_goal(call(V1:U1),V1,call(W1)),
'$call_with_inference_counting'('$call'(W1))
).
:-non_counted_backtracking call/46.
call(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1) :-
( var(A) ->
instantiation_error(call/46)
; A= '$call'(U1) ->
'$prepare_call_clause'(V1,W1,U1,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1),
'$call_with_inference_counting'('$call'(W1:V1))
; '$prepare_call_clause'(V1,W1,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1),
expand_goal(call(W1:V1),W1,call(X1)),
'$call_with_inference_counting'('$call'(X1))
).
:-non_counted_backtracking call/47.
call(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1) :-
( var(A) ->
instantiation_error(call/47)
; A= '$call'(V1) ->
'$prepare_call_clause'(W1,X1,V1,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1),
'$call_with_inference_counting'('$call'(X1:W1))
; '$prepare_call_clause'(W1,X1,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1),
expand_goal(call(X1:W1),X1,call(Y1)),
'$call_with_inference_counting'('$call'(Y1))
).
:-non_counted_backtracking call/48.
call(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1) :-
( var(A) ->
instantiation_error(call/48)
; A= '$call'(W1) ->
'$prepare_call_clause'(X1,Y1,W1,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1),
'$call_with_inference_counting'('$call'(Y1:X1))
; '$prepare_call_clause'(X1,Y1,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1),
expand_goal(call(Y1:X1),Y1,call(Z1)),
'$call_with_inference_counting'('$call'(Z1))
).
:-non_counted_backtracking call/49.
call(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1) :-
( var(A) ->
instantiation_error(call/49)
; A= '$call'(X1) ->
'$prepare_call_clause'(Y1,Z1,X1,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1),
'$call_with_inference_counting'('$call'(Z1:Y1))
; '$prepare_call_clause'(Y1,Z1,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1),
expand_goal(call(Z1:Y1),Z1,call(A2)),
'$call_with_inference_counting'('$call'(A2))
).
:-non_counted_backtracking call/50.
call(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1,X1) :-
( var(A) ->
instantiation_error(call/50)
; A= '$call'(Y1) ->
'$prepare_call_clause'(Z1,A2,Y1,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1,X1),
'$call_with_inference_counting'('$call'(A2:Z1))
; '$prepare_call_clause'(Z1,A2,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1,X1),
expand_goal(call(A2:Z1),A2,call(B2)),
'$call_with_inference_counting'('$call'(B2))
).
:-non_counted_backtracking call/51.
call(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1,X1,Y1) :-
( var(A) ->
instantiation_error(call/51)
; A= '$call'(Z1) ->
'$prepare_call_clause'(A2,B2,Z1,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1,X1,Y1),
'$call_with_inference_counting'('$call'(B2:A2))
; '$prepare_call_clause'(A2,B2,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1,X1,Y1),
expand_goal(call(B2:A2),B2,call(C2)),
'$call_with_inference_counting'('$call'(C2))
).
:-non_counted_backtracking call/52.
call(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1,X1,Y1,Z1) :-
( var(A) ->
instantiation_error(call/52)
; A= '$call'(A2) ->
'$prepare_call_clause'(B2,C2,A2,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1,X1,Y1,Z1),
'$call_with_inference_counting'('$call'(C2:B2))
; '$prepare_call_clause'(B2,C2,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1,X1,Y1,Z1),
expand_goal(call(C2:B2),C2,call(D2)),
'$call_with_inference_counting'('$call'(D2))
).
:-non_counted_backtracking call/53.
call(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1,X1,Y1,Z1,A2) :-
( var(A) ->
instantiation_error(call/53)
; A= '$call'(B2) ->
'$prepare_call_clause'(C2,D2,B2,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1,X1,Y1,Z1,A2),
'$call_with_inference_counting'('$call'(D2:C2))
; '$prepare_call_clause'(C2,D2,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1,X1,Y1,Z1,A2),
expand_goal(call(D2:C2),D2,call(E2)),
'$call_with_inference_counting'('$call'(E2))
).
:-non_counted_backtracking call/54.
call(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1,X1,Y1,Z1,A2,B2) :-
( var(A) ->
instantiation_error(call/54)
; A= '$call'(C2) ->
'$prepare_call_clause'(D2,E2,C2,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1,X1,Y1,Z1,A2,B2),
'$call_with_inference_counting'('$call'(E2:D2))
; '$prepare_call_clause'(D2,E2,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1,X1,Y1,Z1,A2,B2),
expand_goal(call(E2:D2),E2,call(F2)),
'$call_with_inference_counting'('$call'(F2))
).
:-non_counted_backtracking call/55.
call(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1,X1,Y1,Z1,A2,B2,C2) :-
( var(A) ->
instantiation_error(call/55)
; A= '$call'(D2) ->
'$prepare_call_clause'(E2,F2,D2,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1,X1,Y1,Z1,A2,B2,C2),
'$call_with_inference_counting'('$call'(F2:E2))
; '$prepare_call_clause'(E2,F2,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1,X1,Y1,Z1,A2,B2,C2),
expand_goal(call(F2:E2),F2,call(G2)),
'$call_with_inference_counting'('$call'(G2))
).
:-non_counted_backtracking call/56.
call(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1,X1,Y1,Z1,A2,B2,C2,D2) :-
( var(A) ->
instantiation_error(call/56)
; A= '$call'(E2) ->
'$prepare_call_clause'(F2,G2,E2,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1,X1,Y1,Z1,A2,B2,C2,D2),
'$call_with_inference_counting'('$call'(G2:F2))
; '$prepare_call_clause'(F2,G2,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1,X1,Y1,Z1,A2,B2,C2,D2),
expand_goal(call(G2:F2),G2,call(H2)),
'$call_with_inference_counting'('$call'(H2))
).
:-non_counted_backtracking call/57.
call(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1,X1,Y1,Z1,A2,B2,C2,D2,E2) :-
( var(A) ->
instantiation_error(call/57)
; A= '$call'(F2) ->
'$prepare_call_clause'(G2,H2,F2,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1,X1,Y1,Z1,A2,B2,C2,D2,E2),
'$call_with_inference_counting'('$call'(H2:G2))
; '$prepare_call_clause'(G2,H2,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1,X1,Y1,Z1,A2,B2,C2,D2,E2),
expand_goal(call(H2:G2),H2,call(I2)),
'$call_with_inference_counting'('$call'(I2))
).
:-non_counted_backtracking call/58.
call(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1,X1,Y1,Z1,A2,B2,C2,D2,E2,F2) :-
( var(A) ->
instantiation_error(call/58)
; A= '$call'(G2) ->
'$prepare_call_clause'(H2,I2,G2,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1,X1,Y1,Z1,A2,B2,C2,D2,E2,F2),
'$call_with_inference_counting'('$call'(I2:H2))
; '$prepare_call_clause'(H2,I2,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1,X1,Y1,Z1,A2,B2,C2,D2,E2,F2),
expand_goal(call(I2:H2),I2,call(J2)),
'$call_with_inference_counting'('$call'(J2))
).
:-non_counted_backtracking call/59.
call(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1,X1,Y1,Z1,A2,B2,C2,D2,E2,F2,G2) :-
( var(A) ->
instantiation_error(call/59)
; A= '$call'(H2) ->
'$prepare_call_clause'(I2,J2,H2,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1,X1,Y1,Z1,A2,B2,C2,D2,E2,F2,G2),
'$call_with_inference_counting'('$call'(J2:I2))
; '$prepare_call_clause'(I2,J2,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1,X1,Y1,Z1,A2,B2,C2,D2,E2,F2,G2),
expand_goal(call(J2:I2),J2,call(K2)),
'$call_with_inference_counting'('$call'(K2))
).
:-non_counted_backtracking call/60.
call(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1,X1,Y1,Z1,A2,B2,C2,D2,E2,F2,G2,H2) :-
( var(A) ->
instantiation_error(call/60)
; A= '$call'(I2) ->
'$prepare_call_clause'(J2,K2,I2,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1,X1,Y1,Z1,A2,B2,C2,D2,E2,F2,G2,H2),
'$call_with_inference_counting'('$call'(K2:J2))
; '$prepare_call_clause'(J2,K2,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1,X1,Y1,Z1,A2,B2,C2,D2,E2,F2,G2,H2),
expand_goal(call(K2:J2),K2,call(L2)),
'$call_with_inference_counting'('$call'(L2))
).
:-non_counted_backtracking call/61.
call(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1,X1,Y1,Z1,A2,B2,C2,D2,E2,F2,G2,H2,I2) :-
( var(A) ->
instantiation_error(call/61)
; A= '$call'(J2) ->
'$prepare_call_clause'(K2,L2,J2,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1,X1,Y1,Z1,A2,B2,C2,D2,E2,F2,G2,H2,I2),
'$call_with_inference_counting'('$call'(L2:K2))
; '$prepare_call_clause'(K2,L2,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1,X1,Y1,Z1,A2,B2,C2,D2,E2,F2,G2,H2,I2),
expand_goal(call(L2:K2),L2,call(M2)),
'$call_with_inference_counting'('$call'(M2))
).
:-non_counted_backtracking call/62.
call(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1,X1,Y1,Z1,A2,B2,C2,D2,E2,F2,G2,H2,I2,J2) :-
( var(A) ->
instantiation_error(call/62)
; A= '$call'(K2) ->
'$prepare_call_clause'(L2,M2,K2,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1,X1,Y1,Z1,A2,B2,C2,D2,E2,F2,G2,H2,I2,J2),
'$call_with_inference_counting'('$call'(M2:L2))
; '$prepare_call_clause'(L2,M2,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1,X1,Y1,Z1,A2,B2,C2,D2,E2,F2,G2,H2,I2,J2),
expand_goal(call(M2:L2),M2,call(N2)),
'$call_with_inference_counting'('$call'(N2))
).
:-non_counted_backtracking call/63.
call(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1,X1,Y1,Z1,A2,B2,C2,D2,E2,F2,G2,H2,I2,J2,K2) :-
( var(A) ->
instantiation_error(call/63)
; A= '$call'(L2) ->
'$prepare_call_clause'(M2,N2,L2,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1,X1,Y1,Z1,A2,B2,C2,D2,E2,F2,G2,H2,I2,J2,K2),
'$call_with_inference_counting'('$call'(N2:M2))
; '$prepare_call_clause'(M2,N2,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1,X1,Y1,Z1,A2,B2,C2,D2,E2,F2,G2,H2,I2,J2,K2),
expand_goal(call(N2:M2),N2,call(O2)),
'$call_with_inference_counting'('$call'(O2))
).
:-non_counted_backtracking call/64.
call(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1,X1,Y1,Z1,A2,B2,C2,D2,E2,F2,G2,H2,I2,J2,K2,L2) :-
( var(A) ->
instantiation_error(call/64)
; A= '$call'(M2) ->
'$prepare_call_clause'(N2,O2,M2,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1,X1,Y1,Z1,A2,B2,C2,D2,E2,F2,G2,H2,I2,J2,K2,L2),
'$call_with_inference_counting'('$call'(O2:N2))
; '$prepare_call_clause'(N2,O2,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1,X1,Y1,Z1,A2,B2,C2,D2,E2,F2,G2,H2,I2,J2,K2,L2),
expand_goal(call(O2:N2),O2,call(P2)),
'$call_with_inference_counting'('$call'(P2))
).
:-non_counted_backtracking call/65.
call(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1,X1,Y1,Z1,A2,B2,C2,D2,E2,F2,G2,H2,I2,J2,K2,L2,M2) :-
( var(A) ->
instantiation_error(call/65)
; A= '$call'(N2) ->
'$prepare_call_clause'(O2,P2,N2,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1,X1,Y1,Z1,A2,B2,C2,D2,E2,F2,G2,H2,I2,J2,K2,L2,M2),
'$call_with_inference_counting'('$call'(P2:O2))
; '$prepare_call_clause'(O2,P2,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1,X1,Y1,Z1,A2,B2,C2,D2,E2,F2,G2,H2,I2,J2,K2,L2,M2),
expand_goal(call(P2:O2),P2,call(Q2)),
'$call_with_inference_counting'('$call'(Q2))
).