From 66db3d53f850bebc54f81074796746c560cccbd3 Mon Sep 17 00:00:00 2001 From: Vitor Santos Costa Date: Fri, 2 Feb 2018 11:50:07 +0000 Subject: [PATCH] boot --- C/c_interface.c | 20 ++--- C/qlyr.c | 2 +- C/yap-args.c | 48 ++++-------- include/YapDefs.h | 2 + os/iopreds.c | 2 +- os/sysbits.c | 3 +- packages/ProbLog/problog/logger.yap | 112 ++++++++++++++-------------- pl/CMakeLists.txt | 2 +- pl/boot.yap | 3 +- pl/consult.yap | 2 +- pl/directives.yap | 1 + pl/top.yap | 49 ++++++++---- 12 files changed, 122 insertions(+), 124 deletions(-) diff --git a/C/c_interface.c b/C/c_interface.c index 275b1e13f..de13e06f4 100755 --- a/C/c_interface.c +++ b/C/c_interface.c @@ -2109,16 +2109,16 @@ X_API int YAP_InitConsult(int mode, const char *fname, char *full, int *osnop) { int lvl = push_text_stack(); if (mode == YAP_BOOT_MODE) { mode = YAP_CONSULT_MODE; - } - char *bfp = Malloc(YAP_FILENAME_MAX + 1); - bfp[0] = '\0'; - if (fname == NULL || fname[0] == '\0') { - fname = Yap_BOOTFILE; - } - if (fname) { - fl = Yap_AbsoluteFile(fname, bfp, true); - if (!fl || !fl[0]) { - pop_text_stack(lvl); + } + char *bfp = Malloc(YAP_FILENAME_MAX + 1); + bfp[0] = '\0'; + if (fname == NULL || fname[0] == '\0') { + fname = Yap_BOOTFILE; + } + if (fname) { + fl = Yap_AbsoluteFile(fname, bfp, true); + if (!fl || !fl[0]) { + pop_text_stack(lvl); return -1; } } diff --git a/C/qlyr.c b/C/qlyr.c index 7d268b4a5..6ffb8dc7f 100755 --- a/C/qlyr.c +++ b/C/qlyr.c @@ -614,7 +614,7 @@ static size_t read_bytes(FILE *stream, void *ptr, size_t sz) { size_t count = fread(ptr, 1, sz, stream); if (count == sz) return sz; - if (feof(stream)) { + if (feof(stream)) { PlIOError(PERMISSION_ERROR_INPUT_PAST_END_OF_STREAM, TermNil, "read_qly/3: expected %ld bytes got %ld", sz, count); return 0; } else if (ferror(stream)) { diff --git a/C/yap-args.c b/C/yap-args.c index e71221259..1c60b37a3 100755 --- a/C/yap-args.c +++ b/C/yap-args.c @@ -165,7 +165,6 @@ static void consult(const char *b_file USES_REGS) { Functor functor_query = Yap_MkFunctor(Yap_LookupAtom("?-"), 1); Functor functor_command1 = Yap_MkFunctor(Yap_LookupAtom(":-"), 1); Functor functor_compile2 = Yap_MkFunctor(Yap_LookupAtom("c_compile"), 1); - Functor functor_bc = Yap_MkFunctor(Yap_LookupAtom("$bc"), 3); /* consult boot.pl */ char *full = malloc(YAP_FILENAME_MAX + 1); @@ -238,7 +237,7 @@ typedef struct config { const char **dll; const char **ss; const char **oss; - const char **bootpl; + const char **plbootdir; } config_t; const char *gd_root[] = {"@RootDir", "[root]", "(execdir)/.."}; @@ -250,7 +249,8 @@ const char *gd_pl[] = {"@PlDir", "(share)/Yap"}; const char *gd_commons[] = {"@CommonsDir", "(share)/PrologCommons"}; const char *gd_ss[] = {"(dll)"}; const char *gd_oss[] = {"."}; -const char *gd_bootpl[] = {"(pl)/pl"}; +const char *gd_plbootdir[] = {"@BootPlDi", + "(pl)/pl"}; static config_t *gnu(config_t *i) { i->root = gd_root; @@ -262,34 +262,11 @@ static config_t *gnu(config_t *i) { i->commons = gd_commons; i->ss = gd_ss; i->oss = gd_oss; - i->bootpl = gd_bootpl; + i->plbootdir = gd_plbootdir; return i; } -const char *build_root[] = {"."}; -const char *build_lib[] = {"."}; -const char *build_share[] = {"(src)"}; -const char *build_include[] = {"(src/include]"}; -const char *build_dll[] = {"."}; -const char *build_pl[] = {"pl"}; -const char *build_commons[] = {"PrologCommons"}; -const char *build_ss[] = {NULL}; -const char *build_bootpl[] = {"(pl)boot.yap"}; - -static config_t *build(config_t *i) { - i->root = build_root; - i->lib = build_lib; - i->share = build_share; - i->include = build_include; - i->dll = build_dll; - i->pl = build_pl; - i->commons = build_commons; - i->ss = build_ss; - i->bootpl = build_bootpl; - return i; -} - /** * Search */ @@ -355,7 +332,11 @@ char *location(YAP_init_args *iap, const char *inp, char *out) { if (tmp && tmp[0]) strcpy(out, tmp); } else if (strstr(inp + 1, "PlDir") == inp + 1) { - const char *tmp = iap->SavedState; + const char *tmp = iap->PlDir; + if (tmp && tmp[0]) + strcpy(out, tmp); + } else if (strstr(inp + 1, "PlBootDir") == inp + 1) { + const char *tmp = iap->PlBootDir; if (tmp && tmp[0]) strcpy(out, tmp); } else if (strstr(inp + 1, "PrologBootFile") == inp + 1) { @@ -485,6 +466,7 @@ static void Yap_set_locations(YAP_init_args *iap) { Yap_SHAREDIR = find_directory(iap, template->share, NULL); Yap_DLLDIR = find_directory(iap, template->dll, NULL); Yap_PLDIR = find_directory(iap, template->pl, NULL); + Yap_BOOTPLDIR = find_directory(iap, template->plbootdir, NULL); Yap_COMMONSDIR = find_directory(iap, template->commons, NULL); if (iap->SavedState == NULL) iap->SavedState = "startup.yss"; @@ -494,7 +476,7 @@ static void Yap_set_locations(YAP_init_args *iap) { Yap_OUTPUT_STARTUP = find_directory(iap, template->ss, iap->OutputSavedState); if (iap->PrologBootFile == NULL) iap->PrologBootFile = "boot.yap"; - Yap_BOOTFILE = find_directory(iap, template->bootpl, iap->PrologBootFile); + Yap_BOOTFILE = find_directory(iap, template->plbootdir, iap->PrologBootFile); if (Yap_ROOTDIR) setAtomicGlobalPrologFlag(HOME_FLAG, MkAtomTerm(Yap_LookupAtom(Yap_ROOTDIR))); @@ -641,19 +623,15 @@ X_API YAP_file_type_t YAP_parse_yap_arguments(int argc, char *argv[], else if (argv[1] && *argv[1] != '-') { iap->PrologBootFile = *++argv; argc--; - } else { - iap->PrologBootFile = "boot.yap"; } break; case 'B': iap->boot_file_type = YAP_BOOT_PL; if (p[1]) - iap->PrologBootFile = p + 1; + iap->PlDir = p + 1; else if (argv[1] && *argv[1] != '-') { - iap->PrologBootFile = *++argv; + iap->PlDir = *++argv; argc--; - } else { - iap->PrologBootFile = "boot.yap"; } iap->install = true; break; diff --git a/include/YapDefs.h b/include/YapDefs.h index e42ab8951..972cbf578 100755 --- a/include/YapDefs.h +++ b/include/YapDefs.h @@ -198,6 +198,8 @@ typedef struct yap_boot_params { const char *PlDir; //> if NON-NULL, name for a Prolog file to use when booting const char *PrologBootFile; + //> if NON-NULL, directory for a Prolog file to be when booting + const char *PlBootDir; //> if NON-NULL, path where we can find the saved state const char *SavedState; //> bootstrapping mode: YAP is not properly installed diff --git a/os/iopreds.c b/os/iopreds.c index d7a2c3240..b06770c6d 100644 --- a/os/iopreds.c +++ b/os/iopreds.c @@ -1399,7 +1399,7 @@ writable. */ -static Int open3(USES_RfEGS1) { +static Int open3(USES_REGS1) { /* '$open'(+File,+Mode,?Stream,-ReturnCode) */ return do_open(Deref(ARG1), Deref(ARG2), TermNil PASS_REGS); } diff --git a/os/sysbits.c b/os/sysbits.c index daeebc5b0..9aaea32c9 100644 --- a/os/sysbits.c +++ b/os/sysbits.c @@ -1130,7 +1130,6 @@ static Int p_expand_file_name(USES_REGS1) { static Int true_file_name3(USES_REGS1) { Term t = Deref(ARG1), t2 = Deref(ARG2); - char *root = NULL; if (IsVarTerm(t)) { Yap_Error(INSTANTIATION_ERROR, t, "argument to true_file_name unbound"); @@ -1145,7 +1144,7 @@ static Int true_file_name3(USES_REGS1) { Yap_Error(TYPE_ERROR_ATOM, t2, "argument to true_file_name"); return FALSE; } - root = RepAtom(AtomOfTerm(t2))->StrOfAE; + // root = RepAtom(AtomOfTerm(t2))->StrOfAE; } char tmp[YAP_FILENAME_MAX + 1]; if (!Yap_AbsoluteFile(RepAtom(AtomOfTerm(t))->StrOfAE, tmp, true)) diff --git a/packages/ProbLog/problog/logger.yap b/packages/ProbLog/problog/logger.yap index 4d7dc7f0d..c7af8988e 100644 --- a/packages/ProbLog/problog/logger.yap +++ b/packages/ProbLog/problog/logger.yap @@ -9,71 +9,71 @@ % http://dtai.cs.kuleuven.be/problog % % ProbLog was developed at Katholieke Universiteit Leuven -% +% % Copyright 2008, 2009, 2010 % Katholieke Universiteit Leuven -% +% % Main authors of this file: % Bernd Gutmann % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Artistic License 2.0 -% +% % Copyright (c) 2000-2006, The Perl Foundation. -% +% % Everyone is permitted to copy and distribute verbatim copies of this % license document, but changing it is not allowed. Preamble -% +% % This license establishes the terms under which a given free software % Package may be copied, modified, distributed, and/or % redistributed. The intent is that the Copyright Holder maintains some % artistic control over the development of that Package while still % keeping the Package available as open source and free software. -% +% % You are always permitted to make arrangements wholly outside of this % license directly with the Copyright Holder of a given Package. If the % terms of this license do not permit the full use that you propose to % make of the Package, you should contact the Copyright Holder and seek % a different licensing arrangement. Definitions -% +% % "Copyright Holder" means the individual(s) or organization(s) named in % the copyright notice for the entire Package. -% +% % "Contributor" means any party that has contributed code or other % material to the Package, in accordance with the Copyright Holder's % procedures. -% +% % "You" and "your" means any person who would like to copy, distribute, % or modify the Package. -% +% % "Package" means the collection of files distributed by the Copyright % Holder, and derivatives of that collection and/or of those files. A % given Package may consist of either the Standard Version, or a % Modified Version. -% +% % "Distribute" means providing a copy of the Package or making it % accessible to anyone else, or in the case of a company or % organization, to others outside of your company or organization. -% +% % "Distributor Fee" means any fee that you charge for Distributing this % Package or providing support for this Package to another party. It % does not mean licensing fees. -% +% % "Standard Version" refers to the Package if it has not been modified, % or has been modified only in ways explicitly requested by the % Copyright Holder. -% +% % "Modified Version" means the Package, if it has been changed, and such % changes were not explicitly requested by the Copyright Holder. -% +% % "Original License" means this Artistic License as Distributed with the % Standard Version of the Package, in its current version or as it may % be modified by The Perl Foundation in the future. -% +% % "Source" form means the source code, documentation source, and % configuration files for the Package. -% +% % "Compiled" form means the compiled bytecode, object code, binary, or % any other form resulting from mechanical transformation or translation % of the Source form. @@ -81,34 +81,34 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Permission for Use and Modification Without Distribution -% +% % (1) You are permitted to use the Standard Version and create and use % Modified Versions for any purpose without restriction, provided that % you do not Distribute the Modified Version. % % Permissions for Redistribution of the Standard Version -% +% % (2) You may Distribute verbatim copies of the Source form of the % Standard Version of this Package in any medium without restriction, % either gratis or for a Distributor Fee, provided that you duplicate % all of the original copyright notices and associated disclaimers. At % your discretion, such verbatim copies may or may not include a % Compiled form of the Package. -% +% % (3) You may apply any bug fixes, portability changes, and other % modifications made available from the Copyright Holder. The resulting % Package will still be considered the Standard Version, and as such % will be subject to the Original License. % % Distribution of Modified Versions of the Package as Source -% +% % (4) You may Distribute your Modified Version as Source (either gratis % or for a Distributor Fee, and with or without a Compiled form of the % Modified Version) provided that you clearly document how it differs % from the Standard Version, including, but not limited to, documenting % any non-standard features, executables, or modules, and provided that % you do at least ONE of the following: -% +% % (a) make the Modified Version available to the Copyright Holder of the % Standard Version, under the Original License, so that the Copyright % Holder may include your modifications in the Standard Version. (b) @@ -127,7 +127,7 @@ % % Distribution of Compiled Forms of the Standard Version or % Modified Versions without the Source -% +% % (5) You may Distribute Compiled forms of the Standard Version without % the Source, provided that you include complete instructions on how to % get the Source of the Standard Version. Such instructions must be @@ -138,13 +138,13 @@ % within thirty days after you become aware that the instructions are % invalid, then you do not forfeit any of your rights under this % license. -% +% % (6) You may Distribute a Modified Version in Compiled form without the % Source, provided that you comply with Section 4 with respect to the % Source of the Modified Version. % % Aggregating or Linking the Package -% +% % (7) You may aggregate the Package (either the Standard Version or % Modified Version) with other packages and Distribute the resulting % aggregation provided that you do not charge a licensing fee for the @@ -152,7 +152,7 @@ % components in the aggregation are permitted. The terms of this license % apply to the use and Distribution of the Standard or Modified Versions % as included in the aggregation. -% +% % (8) You are permitted to link Modified and Standard Versions with % other works, to embed the Package in a larger work of your own, or to % build stand-alone binary or bytecode versions of applications that @@ -160,7 +160,7 @@ % provided the result does not expose a direct interface to the Package. % % Items That are Not Considered Part of a Modified Version -% +% % (9) Works (including, but not limited to, modules and scripts) that % merely extend or make use of the Package, do not, by themselves, cause % the Package to be a Modified Version. In addition, such works are not @@ -168,21 +168,21 @@ % terms of this license. % % General Provisions -% +% % (10) Any use, modification, and distribution of the Standard or % Modified Versions is governed by this Artistic License. By using, % modifying or distributing the Package, you accept this license. Do not % use, modify, or distribute the Package, if you do not accept this % license. -% +% % (11) If your Modified Version has been derived from a Modified Version % made by someone other than you, you are nevertheless required to % ensure that your Modified Version complies with the requirements of % this license. -% +% % (12) This license does not grant you the right to use any trademark, % service mark, tradename, or logo of the Copyright Holder. -% +% % (13) This license includes the non-exclusive, worldwide, % free-of-charge patent license to make, have made, use, offer to sell, % sell, import and otherwise transfer the Package with respect to any @@ -192,7 +192,7 @@ % that the Package constitutes direct or contributory patent % infringement, then this Artistic License to you shall terminate on the % date that such litigation is filed. -% +% % (14) Disclaimer of Warranty: THE PACKAGE IS PROVIDED BY THE COPYRIGHT % HOLDER AND CONTRIBUTORS "AS IS' AND WITHOUT ANY EXPRESS OR IMPLIED % WARRANTIES. THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A @@ -224,13 +224,13 @@ :- yap_flag(unknown,error). :- style_check(single_var). - +:- start_low_level_trace. :- initialization(( bb_put(logger_filename,'out.dat'), bb_put(logger_delimiter,';'), - bb_put(logger_variables,[]) + bb_put(logger_variables,[]) )). - +:- stopS_low_level_trace. %======================================================================== %= Defines a new variable, possible types are: int, float and time @@ -289,7 +289,7 @@ logger_set_filename(Name) :- %======================================================================== %= Set the delimiter for the fields -%= +%= %= +Delimiter %======================================================================== @@ -298,7 +298,7 @@ logger_set_delimiter(Delimiter) :- %======================================================================== %= Set the value of the variable name. If the value is already set or %= if the variable does not exists, an error will be displayed and the -%= Prolog will be halted. +%= Prolog will be halted. %= %= +Name, +Value %======================================================================== @@ -325,13 +325,13 @@ logger_set_variable(Name,Value) :- nl, fail ) - ) + ) ),!. %======================================================================== %= Set the value of the variable name. If the value is already set or %= the old value is overwritten. If the variable does not exists, an -%= error will be displayed and the Prolog will be halted. +%= error will be displayed and the Prolog will be halted. %= %= +Name, +Value %======================================================================== @@ -372,7 +372,7 @@ logger_add_to_variable(Name,Value) :- %======================================================================== %= Get the value of the variable name. If the value is not yet set or %= if the variable does not exists, an error will be displayed and the -%= Prolog will be halted. +%= Prolog will be halted. %= %= +Name, +Value %======================================================================== @@ -390,18 +390,18 @@ logger_get_variable(Name,Value) :- fail );( bb_get(Key,Value) - ; + ; ( write('logger_set_variable, unknown variable '), write(Name), nl, fail - ) + ) ) ),!. %======================================================================== -%= -%= +%= +%= %= +Name %======================================================================== @@ -424,7 +424,7 @@ logger_start_timer(Name) :- ) ), !. - + logger_stop_timer(Name) :- atom_concat(logger_start_time_,Name,Key), @@ -449,7 +449,7 @@ logger_stop_timer(Name) :- %======================================================================== %= write a new line to the log file, which contains all the %= values of the variables. afterwards, reset all variables to null. -%= +%= %======================================================================== logger_write_data :- @@ -460,7 +460,7 @@ logger_write_data :- close(Handle), logger_reset_all_variables. - + logger_write_data_intern([],_). logger_write_data_intern([(Name,_Type)],Handle) :- variablevalue_with_nullcheck(Name,Value), @@ -478,14 +478,14 @@ variablevalue_with_nullcheck(Name,Result) :- bb_get(Key,Value), ( Value=null - -> - Result = '' ; + -> + Result = '' ; Result=Value ). %======================================================================== -%= -%= -%= +%= +%= +%= %======================================================================== logger_reset_all_variables :- @@ -497,9 +497,9 @@ logger_reset_all_variables :- %======================================================================== -%= -%= -%= +%= +%= +%= %======================================================================== @@ -513,7 +513,7 @@ logger_write_header :- logger_write_header_intern(Variables,1,Handle), format(Handle,'#####################################################################~n',[]), close(Handle). - + logger_write_header_intern([],_,_). logger_write_header_intern([(Name,Type)|T],Position,Handle) :- format(Handle,'# ~q~6+~q~7+~q~n',[Position,Type,Name]), diff --git a/pl/CMakeLists.txt b/pl/CMakeLists.txt index 8cee764fc..10e624921 100644 --- a/pl/CMakeLists.txt +++ b/pl/CMakeLists.txt @@ -75,7 +75,7 @@ DESTINATION ${libpl}/library) DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/startup.yss) add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/startup.yss - COMMAND yap-bin -B${CMAKE_CURRENT_SOURCE_DIR}/boot.yap --output-saved-state=${CMAKE_CURRENT_BINARY_DIR}/startup.yss + COMMAND yap-bin -B${CMAKE_CURRENT_SOURCE_DIR} --output-saved-state=${CMAKE_CURRENT_BINARY_DIR}/startup.yss DEPENDS ${PL_BOOT_SOURCES} yap-bin ) #else () diff --git a/pl/boot.yap b/pl/boot.yap index 1c3be8b4e..478a8e4b1 100644 --- a/pl/boot.yap +++ b/pl/boot.yap @@ -205,7 +205,7 @@ print_message(L,E) :- ( (Con = top ; var(C) ; C = [_|_]) -> '$execute_command'(C,VL,Pos,Con,C), ! ; % do term expansion - expand_term(C, EC), + '$expand_term'(C, EC), % execute a list of commands '$execute_commands'(EC,VL,Pos,Con,_Source), % succeed only if the *original* was at end of file. @@ -453,3 +453,4 @@ If this hook predicate succeeds it must instantiate the _Action_ argument to th :- ensure_loaded('../pl/pathconf.yap'). :- yap_flag(user:unknown,error). + diff --git a/pl/consult.yap b/pl/consult.yap index 0ade621e7..82c61dcd4 100644 --- a/pl/consult.yap +++ b/pl/consult.yap @@ -1588,7 +1588,7 @@ End of conditional compilation. catch('$eval_if'(G), E, (print_message(error, E), fail)). '$eval_if'(Goal) :- - expand_term(Goal,TrueGoal), + '$expand_term'(Goal,TrueGoal), once(TrueGoal). '$if_directive'((:- if(_))). diff --git a/pl/directives.yap b/pl/directives.yap index 862903057..fa03a8333 100644 --- a/pl/directives.yap +++ b/pl/directives.yap @@ -238,6 +238,7 @@ user_defined_directive(Dir,Action) :- '$thread_initialization'(M:D) :- eraseall('$thread_initialization'), + writeln(M:D), recorda('$thread_initialization',M:D,_), fail. '$thread_initialization'(M:D) :- diff --git a/pl/top.yap b/pl/top.yap index 482fb90a0..9eadfb5a9 100644 --- a/pl/top.yap +++ b/pl/top.yap @@ -176,16 +176,17 @@ current_prolog_flag(break_level, BreakLevel), % % Hack in case expand_term has created a list of commands. % - '$execute_commands'(V,_,_,_,Source) :- var(V), !, +'$execute_commands'(V,_,_,_,Source) :- var(V), !, '$do_error'(instantiation_error,meta_call(Source)). - '$execute_commands'([],_,_,_,_) :- !. - '$execute_commands'([C|Cs],VL,Pos,Con,Source) :- !, - ( - '$system_catch'('$execute_command'(C,VL,Pos,Con,Source),prolog,Error,'$LoopError'(Error, Con)), - fail - ; - '$execute_commands'(Cs,VL,Pos,Con,Source) - ). +'$execute_commands'([],_,_,_,_) :- !. +'$execute_commands'([C|Cs],VL,Pos,Con,Source) :- + !, + ( + '$system_catch'('$execute_command'(C,VL,Pos,Con,Source),prolog,Error,'$LoopError'(Error, Con)), + fail + ; + '$execute_commands'(Cs,VL,Pos,Con,Source) + ). '$execute_commands'(C,VL,Pos,Con,Source) :- '$execute_command'(C,VL,Pos,Con,Source). @@ -211,15 +212,14 @@ current_prolog_flag(break_level, BreakLevel), \+ '$if_directive'(Command), !. '$execute_command'((:-G),VL,Pos,Option,_) :- -% !, - Option \= top, - !, % allow user expansion - catch(expand_term((:- G), O),_O, fail), - ( + Option \= top, + !, % allow user expansion + '$expand_term'((:- G), O), + ( O = (:- G1) -> - '$yap_strip_module'(G1, M, G2), - '$process_directive'(G2, Option, M, VL, Pos) + '$yap_strip_module'(G1, M, NG), + '$process_directive'(NG, Option, M, VL, Pos) ; '$execute_commands'(G1,VL,Pos,Option,O) ). @@ -230,6 +230,23 @@ current_prolog_flag(break_level, BreakLevel), '$execute_command'(G, VL, Pos, Option, Source) :- '$continue_with_command'(Option, VL, Pos, G, Source). +'$expand_term'(T,O) :- + catch( '$expand_term0'(T,O), _,( '$disable_debugging', fail) ), + !. + +'$expand_term0'(T,O) :- + expand_term( T, T1), + !, + '$expand_term1'(T1,O). +'$expand_term0'(T,T). + +'$expand_term1'(T,O) :- + '$yap_strip_module'(T1, M, G2), + '$is_metapredicate'(G2,M), + '$expand_meta_call'(M:G2, [], O), + !. +'$expand_term1'(O,O). + '$continue_with_command'(Where,V,'$stream_position'(C,_P,A1,A2,A3),'$source_location'(_F,L):G,Source) :- !, '$continue_with_command'(Where,V,'$stream_position'(C,L,A1,A2,A3),G,Source).