home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 9 / 09.iso / l / l210 / 1.ddi / PIE.ARC / PIE.INF < prev    next >
Encoding:
Text File  |  1988-06-21  |  17.1 KB  |  642 lines

  1. /*****************************************************************************
  2.             Prolog Inference Engine
  3.             =======================
  4.  
  5.    Copyright (c) 1986, 88 by Borland International, Inc
  6.  
  7.    Module pie.inf: The inferenge engine
  8. *****************************************************************************/
  9.  
  10. /*****************************************************************************
  11.         General Help predicates
  12. *****************************************************************************/
  13.  
  14. PREDICATES
  15.   listlen(TERML,INTEGER,INTEGER) % Gives the length of a list
  16.   listlen(STERML,INTEGER,INTEGER)
  17.   member(E,ENV)             % The god old member
  18.   nondeterm repeat         % The even older repeat
  19.   getfilename(TERM,STRING)     % construct the filename with extension
  20.  
  21. CLAUSES
  22.   listlen([],N,N):-!.
  23.   listlen([_|T],SUB,N):-SUB1=SUB+1,listlen(T,SUB1,N).
  24.  
  25.   member(X,[X|_]):-!.
  26.   member(X,[_|L]):-member(X,L).
  27.  
  28.   repeat.
  29.   repeat:-repeat.
  30.  
  31.   getfilename(atom(S),FILENAME):-!,
  32.     concat(S,".pie",FILENAME).
  33.   getfilename(str(S),FILENAME):- 
  34.         fronttoken(S,_,""),!,
  35.     concat(S,".pie",FILENAME).
  36.   getfilename(str(FILENAME),FILENAME).
  37.  
  38. /*****************************************************************************
  39.     Expression evaluation
  40. *****************************************************************************/
  41.  
  42. PREDICATES
  43.   eval(TERM,REFINT)
  44.  
  45. CLAUSES
  46.   eval(T,_):-free(T),!,fail.  % or 'exit(1020)' free var in expression
  47.   eval(int(I),I):-!.
  48.   eval(cmp("+",[T1,T2]),R):- !, eval(T1,R1),eval(T2,R2),R=R1+R2.
  49.   eval(cmp("-",[T1,T2]),R):- !, eval(T1,R1),eval(T2,R2),R=R1-R2.
  50.   eval(cmp("*",[T1,T2]),R):- !, eval(T1,R1),eval(T2,R2),R=R1*R2.
  51.   eval(cmp("/",[T1,T2]),R):- !, eval(T1,R1),eval(T2,R2),R=R1 div R2.
  52.   eval(cmp("-",[T1]),R):-    !, eval(T1,R1),R=-R1.
  53.   eval(cmp("mod",[T1,T2]),R):- !, eval(T1,R1),eval(T2,R2),R=R1 mod R2.
  54.   eval(cmp("abs",[T]),R):-!,eval(T,R1),R=abs(R1).
  55.  
  56.  
  57. /*****************************************************************************
  58.     File system
  59. *****************************************************************************/
  60.  
  61. DATABASE - seetell
  62.   determ seeing_name(STRING)
  63.   determ telling_name(STRING)
  64.  
  65. PREDICATES
  66.   tell(STRING)
  67.   telling(STRING)
  68.   told
  69.   see(STRING)
  70.   seeing(STRING)
  71.   seen
  72.  
  73. CLAUSES
  74.   tell(FILENAME):-
  75.     closefile(telling),
  76.     openwrite(telling,FILENAME),
  77.     writedevice(telling),
  78.     retractall(telling_name(_)),
  79.     assert(telling_name(FILENAME)).
  80.  
  81.   telling(FILENAME):-
  82.     telling_name(FILENAME).
  83.  
  84.   told:-
  85.     retract(telling_name(_)),!,
  86.     closefile(telling).
  87.   told.
  88.  
  89.   see(FILENAME):-
  90.     closefile(seeing),
  91.     openread(seeing,FILENAME),
  92.     readdevice(seeing),
  93.     retractall(seeing_name(_)),
  94.     assert(seeing_name(FILENAME)).
  95.  
  96.   seeing(FILENAME):-
  97.     seeing_name(FILENAME).
  98.  
  99.   seen:-
  100.     retract(seeing_name(_)),!,
  101.     closefile(seeing).
  102.   seen.
  103.  
  104. /*****************************************************************************
  105.         Handle clause listing
  106. *****************************************************************************/
  107.  
  108. PREDICATES
  109.   list
  110.   list(STRING)
  111.   list(STRING,INTEGER)
  112.   wclause(STERM,STERM)
  113.   handle_list(TERML)
  114.  
  115. CLAUSES
  116.   % list all clauses in the database
  117.   list:-clause(A,B),wclause(A,B),write(".\n"),fail.
  118.   list.
  119.  
  120.   % list  pred for all arities
  121.   list(ID):-
  122.     clause(cmp(ID,TERML),BODY),
  123.     wclause(cmp(ID,TERML),BODY),
  124.     write(".\n"),
  125.     fail.
  126.   list(_).
  127.  
  128.   % list  pred/arity
  129.   list(ID,N):-
  130.     clause(cmp(ID,TERML),BODY),
  131.     listlen(TERML,0,N),
  132.     wclause(cmp(ID,TERML),BODY),
  133.     write(".\n"),
  134.     fail.
  135.   list(_,_).
  136.  
  137.   wclause(HEAD,atom(true)):-!,wterm("list",HEAD).
  138.   wclause(HEAD,BODY):-wterm("list",cmp(":-",[HEAD,BODY])).
  139.  
  140.   handle_list([]):-!,list.
  141.   handle_list([atom(Pid)]):-!,list(PID).
  142.   handle_list([cmp("/",[atom(PID),int(N)])]):-list(PID,N).
  143.  
  144. /*****************************************************************************
  145.         Handle assert
  146. *****************************************************************************/
  147.  
  148. PREDICATES
  149.   convhead(STERM,STERM)
  150.   ascla(CHAR,STERM,STERM)
  151.   assertclause(CHAR,STERM)
  152.  
  153. CLAUSES
  154.   convhead(atom(ID),cmp(ID,[])):-!.
  155.   convhead(HEAD,HEAD).
  156.  
  157.   ascla('a',H,B):-!,asserta(clause(H,B)).
  158.   ascla(_,H,B):-   assertz(clause(H,B)).
  159.  
  160.   assertclause(C,cmp(":-",[HEAD,BODY])):-!,
  161.     convhead(HEAD,HEAD1),
  162.     ascla(C,HEAD1,BODY).
  163.   assertclause(C,HEAD):-
  164.     convhead(HEAD,HEAD1),
  165.     ascla(C,HEAD1,atom(true)).
  166.  
  167. /*****************************************************************************
  168.         Handle Consult
  169. *****************************************************************************/
  170.  
  171. PREDICATES
  172.   cons(STRING)
  173.   sav(STRING)
  174.   parse_clauses(TOKL)
  175.  
  176. CLAUSES
  177.   parse_clauses(TOKL):-
  178.     s_lowerterm(TOKL,TOKL1,TERM),!,
  179.     assertclause('0',TERM),
  180.     parse_clauses(TOKL1).
  181.   parse_clauses(_).
  182.  
  183.   cons(FIL):-
  184.     file_str(FIL,TXT),
  185.     tokl(0,TXT,TOKL),!,
  186.     parse_clauses(TOKL).
  187.   cons(_).
  188.  
  189.   sav(FIL):-
  190.     openwrite(temp,FIL),
  191.     writedevice(temp),
  192.     list,
  193.     closefile(temp).
  194.  
  195. /*****************************************************************************
  196.         Handle ReConsult
  197. *****************************************************************************/
  198.  
  199. PREDICATES
  200.   recons(STRING)
  201.   recons_parse(TOKL)
  202.   recons_newclause(STERM)
  203.   recons_newclause_change(STERM,STERM)
  204.  
  205. DATABASE - reconsulted
  206.   removed(STRING)
  207.  
  208. CLAUSES
  209.   recons_newclause_change(cmp(PID,TERML),BODY):-
  210.     not(removed(PID)),
  211.     retractall(clause(cmp(PID,_),_)),
  212.     assert(removed(PID)),
  213.     fail;
  214.     ascla('0',cmp(PID,TERML),BODY).
  215.  
  216.   recons_newclause(cmp(":-",[HEAD,BODY])):-!,
  217.     convhead(HEAD,HEAD1),
  218.     recons_newclause_change(HEAD1,BODY).
  219.   recons_newclause(HEAD):-
  220.     convhead(HEAD,HEAD1),
  221.     recons_newclause_change(HEAD1,atom(true)).
  222.  
  223.   recons_parse(TOKL):-
  224.     s_lowerterm(TOKL,TOKL1,TERM),!,
  225.     recons_newclause(TERM),
  226.     recons_parse(TOKL1).
  227.   recons_parse(_).
  228.  
  229.   recons(FIL):-
  230.     retractall(_,reconsulted),
  231.     file_str(FIL,TXT),
  232.     tokl(0,TXT,TOKL),!,
  233.     recons_parse(TOKL).
  234.   recons(_).
  235.  
  236. /*****************************************************************************
  237.         Handle editor
  238. *****************************************************************************/
  239.  
  240. PREDICATES
  241.   ed
  242.   ed(STRING)
  243.   ed(STRING,INTEGER)
  244.   handle_edit(TERML)
  245.  
  246. CLAUSES
  247.   ed:-     openwrite(temp,"temp.$$$"),
  248.     writedevice(temp),
  249.     list,
  250.     closefile(temp),
  251.     file_str("temp.$$$",TXT),
  252.     makewindow(1,2,23,"CLAUSES",5,5,15,70),
  253.     edit(TXT,TXT1),
  254.     removewindow,
  255.     shiftwindow(OLD),shiftwindow(1),shiftwindow(OLD),
  256.     TXT1><TXT,
  257.     file_str("temp.$$$",TXT1),
  258.     recons("temp.$$$"),!,
  259.     deletefile("temp.$$$").
  260.   ed.
  261.  
  262.   ed(FILENAME):-
  263.     file_str(FILENAME,TXT),
  264.     makewindow(1,2,23,"CLAUSES",5,5,15,70),
  265.     edit(TXT,TXT1),
  266.     removewindow,
  267.     shiftwindow(OLD),shiftwindow(1),shiftwindow(OLD),
  268.     file_str(FILENAME,TXT1),
  269.     recons(FILENAME),!.
  270.   ed(_).
  271.  
  272.   ed(ID,N):-
  273.       FILENAME="temp.$$$",
  274.       openwrite(temp,FILENAME),
  275.     writedevice(temp),
  276.     list(ID,N),
  277.     closefile(temp),
  278.     file_str(FILENAME,TXT),
  279.     deletefile("temp.$$$"),
  280.     makewindow(1,2,23,"CLAUSES",5,5,15,70),
  281.     edit(TXT,TXT1),
  282.     removewindow,
  283.     shiftwindow(OLD),shiftwindow(1),shiftwindow(OLD),
  284.     TXT1><TXT,
  285.     file_str(FILENAME,TXT1),
  286.     recons(FILENAME),!.
  287.   ed(_,_).
  288.  
  289.   handle_edit([]):-!,
  290.     ed.
  291.   handle_edit([cmp("/",[atom(PID),int(N)])]):-
  292.     bound(PID),bound(N),!,
  293.     ed(PID,N).
  294.   handle_edit([TERM]):-!,
  295.     bound(TERM),getfilename(TERM,FILENAME),ed(FILENAME).
  296.  
  297. /*****************************************************************************
  298.     Misc help predicates for implementing standard predicates
  299. *****************************************************************************/
  300.  
  301. PREDICATES
  302.   eeq(TERM,TERM)        % True equality
  303.   eeqterml(TERML,TERML)
  304.   list_terml(TERM,TERML)    % Conversion between list and TERML
  305.   retractclause(STERM,STERM)    % Used to give a deterministic retract
  306.   nondeterm handle_op(REFINT,REFSYMB,REFSYMB).
  307.   functor(TERM,REFSYMB,REFINT)
  308.   arg(INTEGER,TERML,TERM)
  309.   writeterml(DISPLAY,TERML)
  310.  
  311. CLAUSES
  312.   eeq(T1,T2):-free(T1),free(T2),T1=int(0),T2=int(1),!,fail.
  313.   eeq(T1,T2):-free(T1),free(T2),!.
  314.   eeq(T1,T2):-free(T1),!,fail; free(T2),!,fail.
  315.   eeq(cmp(ID,TERML1),cmp(ID,TERML2)):-!,eeqterml(TERML1,TERML2).
  316.   eeq(list(H1,T1),list(H2,T2)):-!,eeq(H1,H2),eeq(T1,T2).
  317.   eeq(X,X).
  318.  
  319.   eeqterml([],[]):-!.
  320.   eeqterml([H1|T1],[H2|T2]):-
  321.     eeq(H1,H2),eeqterml(T1,T2).
  322.  
  323.   list_terml(nill,[]):-!.
  324.   list_terml(list(H,T),[H|TT]):-list_terml(T,TT).
  325.  
  326.   retractclause(HEAD,BODY):-
  327.     retract(clause(HEAD,BODY)),!.
  328.  
  329.   handle_op(PRIOR,XFY,OP):-
  330.     bound(PRIOR),bound(XFY),bound(OP),!,
  331.     PRIOR1=PRIOR,XFY1=XFY,OP1=OP,
  332.     retractall(op(_,_,OP1)),
  333.     assert(op(PRIOR1,XFY1,OP1)).
  334.   handle_op(PRIOR,XFY,OP):-
  335.     op(P1,A1,O1),
  336.     P1=PRIOR,A1=XFY,O1=OP.
  337.  
  338.   functor(cmp(ID,TERML),ID,N):-
  339.     bound(N),!,bound(ID),listlen(TERML,0,N).
  340.   functor(cmp(ID,TERML),ID,N):-!,
  341.     bound(ID),free(N),
  342.     listlen(TERML,0,N1),N=N1.
  343.   functor(atom(S),S,0):-!.
  344.  
  345.   arg(1,[X|_],X):-!.
  346.   arg(N,[_|T],X):-
  347.     N1=N-1,
  348.     arg(N1,T,X).
  349.  
  350.   writeterml(_,[]):-!.
  351.   writeterml(DISPLAY,[H|T]):-wterm(DISPLAY,H),writeterml(DISPLAY,T).
  352.  
  353. /*****************************************************************************
  354.     Variable name generator for assert of rules
  355. *****************************************************************************/
  356.  
  357. DATABASE - varno
  358.   determ current_var(INTEGER)
  359.  
  360. PREDICATES
  361.   reset_vargenerator
  362.   createVar(TERM,ENV,STRING)
  363.   lookup_termid(TERM,ENV,STRING)
  364.   get_next_unused(ENV,INTEGER,INTEGER,STRING)
  365.   vid_exist(STRING,ENV)
  366.  
  367. CLAUSES
  368.   reset_vargenerator:-
  369.     retractall(current_var(_)),
  370.     assert(current_var(0)).
  371.  
  372.   createVar(TERM,ENV,ID):-
  373.     lookup_termid(TERM,ENV,ID),!.
  374.   createVar(TERM,ENV,NEWID):-
  375.     retract(current_var(NO)),
  376.     NO1=NO+1,
  377.     get_next_unused(ENV,NO1,NO2,NEWID),
  378.     member(e(NEWID,TERM),ENV),
  379.     assert(current_var(NO2)).
  380.  
  381.   lookup_termid(_,ENV,_):-free(ENV),!,fail.
  382.   lookup_termid(TERM,[e(ID,TERM1)|_],ID):-
  383.     eeq(TERM,TERM1),!.
  384.   lookup_termid(TERM,[_|ENV],ID):-
  385.     lookup_termid(TERM,ENV,ID).
  386.  
  387.   get_next_unused(ENV,NO,NO,NEWID):-
  388.     str_int(ID,NO),concat("_",ID,NEWID),
  389.     not(vid_exist(NEWID,ENV)),!.
  390.   get_next_unused(ENV,NO1,NO3,ID):-
  391.     NO2=NO1+1,
  392.     get_next_unused(ENV,NO2,NO3,ID).
  393.  
  394.   vid_exist(_,ENV):-free(ENV),!,fail.
  395.   vid_exist(VID,[e(VID,_)|_]):-!.
  396.   vid_exist(VID,[_|L]):-vid_exist(VID,L).
  397.  
  398. /*****************************************************************************
  399.     Implementation of trace
  400. *****************************************************************************/
  401.  
  402. ifdef implement_trace
  403. PREDICATES
  404.   showtrace(STRING,STRING,TERML)
  405.   nondeterm trace_call(STRING,TERML)
  406.   nondeterm report_redo(STRING,TERML)
  407.  
  408. CLAUSES
  409.   trace_call(PID,TERML):-not(traceflag),!,call(PID,TERML).
  410.   trace_call(PID,TERML):-
  411.     showtrace("CALL:   ",PID,TERML),
  412.     call(PID,TERML),
  413.     report_redo(PID,TERML),
  414.     showtrace("RETURN: ",PID,TERML).
  415.   trace_call(PID,TERML):-
  416.     showtrace("FAIL:   ",PID,TERML),
  417.     fail.
  418.  
  419.   report_redo(_,_).
  420.   report_redo(PID,TERML):-
  421.     showtrace("REDO:   ",PID,TERML),
  422.     fail.
  423.  
  424.   showtrace(STR,PID,TERML):-
  425.     shiftwindow(OLD),shiftwindow(3),
  426.     attribute(15),write(STR),attribute(7),
  427.     wterm("write",cmp(PID,TERML)),nl,
  428.     shiftwindow(OLD).
  429.  
  430. elsedef  % call the predicate "call" directly
  431.  
  432. CONSTANTS
  433.   trace_call = call
  434. enddef
  435.  
  436. /*****************************************************************************
  437.     The inference engine
  438. *****************************************************************************/
  439.  
  440. PREDICATES
  441.   % nondeterm call(STRING,TERML) declared as first predicate due to memory problems
  442.   unify_term(TERM,STERM,ENV)
  443.   unify_terml(TERML,STERML,ENV)
  444.   nondeterm unify_body(STERM,ENV,INTEGER)
  445.  
  446.   handle_assert(CHAR,STERM,ENV)
  447.   nondeterm handle_retract(TERM)
  448.  
  449. CLAUSES
  450.   handle_assert(Poscode,TERM,ENV):-
  451.     unify_term(CALL,TERM,ENV),
  452.     reset_vargenerator,
  453.     unify_term(CALL,STERM,ENV),
  454.     assertclause(Poscode,STERM),
  455.     fail.    % Remove generated identifiers from environment
  456.   handle_assert(_,_,_).
  457.  
  458.   handle_retract(cmp(":-",[cmp(ID,TERML),BODY])):-
  459.     bound(ID),!,
  460.     clause(cmp(ID,STERML),SBODY),
  461.     free(ENV),
  462.     unify_terml(TERML,STERML,ENV),
  463.     unify_term(BODY,SBODY,ENV),
  464.     retractclause(cmp(ID,STERML),SBODY).
  465.  
  466.   handle_retract(cmp(":-",[HEAD,BODY])):-free(HEAD),!,
  467.     clause(SHEAD,SBODY),
  468.     free(ENV),
  469.     unify_term(HEAD,SHEAD,ENV),
  470.     unify_term(BODY,SBODY,ENV),
  471.     retractclause(SHEAD,SBODY).
  472.  
  473.   handle_retract(cmp(ID,TERML)):-
  474.     clause(cmp(ID,TERML1),atom(true)),
  475.     free(ENV),
  476.     unify_terml(TERML,TERML1,ENV),
  477.     retractclause(cmp(ID,TERML1),atom(true)).
  478.  
  479.  
  480.   unify_terml([],[],_):-!.
  481.   unify_terml([TERM1|TL1],[TERM2|TL2],ENV):-
  482.     unify_term(TERM1,TERM2,ENV),unify_terml(TL1,TL2,ENV).
  483.  
  484.   unify_term(TERM,var(ID),ENV):-free(ID),free(TERM),!,createVar(TERM,ENV,ID).
  485.   unify_term(_,STerm,_):-bound(STerm),Sterm=var("_"),!.
  486.   unify_term(Term,var(ID),ENV):-bound(ID),!,member(e(ID,Term1),ENV),Term1=Term.
  487.   unify_term(int(I),int(I),_):-!.
  488.   unify_term(atom(A),atom(A),_):-!.
  489.   unify_term(str(S),str(S),_):-!.
  490.   unify_term(char(C),char(C),_):-!.
  491.   unify_term(list(H1,T1),list(H2,T2),ENV):-!,
  492.     unify_term(H1,H2,ENV),unify_term(T1,T2,ENV).
  493.   unify_term(nill,nill,_):-!.
  494.   unify_term(cmp(ID,L1),cmp(ID,L2),ENV):-!,unify_terml(L1,L2,ENV).
  495.  
  496.   unify_body(atom(true),_,_):-!.
  497.   unify_body(cmp(",",[TERM1,TERM2]),ENV,BTOP):-!,
  498.     unify_body(TERM1,ENV,BTOP),unify_body(TERM2,ENV,BTOP).
  499.   unify_body(atom("!"),_,BTOP):-!,cutbacktrack(BTOP).
  500.   unify_body(cmp(";",[TERM,_]),ENV,BTOP):-unify_body(TERM,ENV,BTOP).
  501.   unify_body(cmp(";",[_,TERM]),ENV,BTOP):-!,unify_body(TERM,ENV,BTOP).
  502.   unify_body(cmp("not",[TERM]),ENV,_):-
  503.     getbacktrack(BTOP),unify_body(TERM,ENV,BTOP),!,fail.
  504.   unify_body(cmp("not",_),_,_):-!.
  505.   unify_body(cmp("call",[TERM]),ENV,_):-!,
  506.     getbacktrack(BTOP),unify_body(TERM,ENV,BTOP).
  507.   unify_body(cmp("assert",[TERM]),ENV,_):- !,handle_assert('0',TERM,ENV).
  508.   unify_body(cmp("asserta",[TERM]),ENV,_):-!,handle_assert('a',TERM,ENV).
  509.   unify_body(cmp("assertz",[TERM]),ENV,_):-!,handle_assert('z',TERM,ENV).
  510.   unify_body(cmp(PID,TERML),ENV,_):-
  511.     unify_terml(CALL,TERML,ENV),trace_call(PID,CALL).
  512.   unify_body(var(ID),ENV,_):-!,
  513.     member(e(ID,TERM),ENV),bound(TERM),
  514.     TERM=cmp(PID,TERML), trace_call(PID,TERML).
  515.   unify_body(atom(PID),_,_):-
  516.     trace_call(PID,[]).
  517.  
  518.  
  519.   call("fail",[]):-!,fail.
  520.  
  521.   call("repeat",[]):-!,repeat.
  522.  
  523.   call("write",TERML):-!, writeterml("write",TERML).
  524.  
  525.   call("nl",[]):-!, nl.
  526.  
  527.   call("display",TERML):-!,writeterml("display",TERML).
  528.  
  529.   call("read",[TERM]):-!,
  530.     readln(L),
  531.       tokl(0,L,TOKL),
  532.     s_term(TOKL,_,STERM),
  533.     free(E),
  534.     unify_term(TERM,STERM,E).
  535.  
  536.   call("readln",[str(L1)]):-!,
  537.     readln(L),L1=L.
  538.  
  539.   call("readchar",[char(CH)]):-!,
  540.     readchar(CH1),CH=CH1.
  541.  
  542.   call("help",[]):-!,
  543.     file_str("pie.hlp",HELPINF),
  544.     makewindow(1,7,7,"Help Information",0,0,24,80),
  545.     display(HELPINF),
  546.     removewindow,
  547.     shiftwindow(1),
  548.     shiftwindow(2).
  549.  
  550.   call("retract",[TERM]):-!,handle_retract(TERM).
  551.  
  552.   call("tell",[str(FILENAME)]):-!,bound(FILENAME),tell(FILENAME).
  553.   call("telling",[str(FILENAME)]):-!,telling(FILENAME1),FILENAME=FILENAME1.
  554.   call("told",[]):-!,told.
  555.  
  556.   call("see",[str(FILENAME)]):-!,bound(FILENAME),see(FILENAME).
  557.   call("seeing",[str(FILENAME)]):-!,seeing(FILENAME1),FILENAME=FILENAME1.
  558.   call("seen",[]):-!,seen.
  559.  
  560.   call("=..",[cmp(ID,TERML),list(atom(ID),LIST)]):-!,
  561.     list_terml(LIST,TERML).
  562.  
  563.   call("arg",[int(N),cmp(FID,TERML),X]):-!,
  564.     bound(N),bound(FID),N>0,
  565.     arg(N,TERML,X).
  566.  
  567.   call("functor",[TERM,atom(FID),int(ARITY)]):-!,
  568.     functor(TERM,FID,ARITY).
  569.  
  570.   call("clause",[HEAD,BODY]):-!,
  571.     clause(SHEAD,SBODY),
  572.     free(ENV),
  573.     unify_term(HEAD,SHEAD,ENV),
  574.     unify_term(BODY,SBODY,ENV).
  575.  
  576.   call("concat",[str(A),str(B),str(C)]):-!,
  577.     concat(A,B,C).
  578.  
  579.   call("str_int",[str(STR),int(I)]):-!,
  580.     str_int(STR,I).
  581.  
  582.   call("str_atom",[str(STR),atom(SYMB)]):-!,
  583.     STR=SYMB.
  584.  
  585.   call("is",[int(Res),T2]):-!, eval(T2,Res).
  586.  
  587.   call("==",[T1,T2]):-!, eeq(T1,T2).
  588.   call("\\==",[T1,T2]):-!, not(eeq(T1,T2)).
  589.  
  590.   call("=",[X,X]):-!.
  591.   call("\\=",[X,Y]):-!,not(X=Y).
  592.   call("<",[T1,T2]):-!,eval(T1,X),eval(T2,Y),X<Y.
  593.   call(">",[T1,T2]):-!,eval(T1,X),eval(T2,Y),X>Y.
  594.   call("=<",[T1,T2]):-!,eval(T1,X),eval(T2,Y),X<=Y.
  595.   call(">=",[T1,T2]):-!,eval(T1,X),eval(T2,Y),X>=Y.
  596.   call("><",[T1,T2]):-!,eval(T1,X),eval(T2,Y),X><Y.
  597.  
  598.   call("integer",[TERM]):-!,bound(TERM),TERM=int(_).
  599.  
  600.   call("var",[TERM]):-!,free(TERM).
  601.   call("nonvar",[TERM]):-!,bound(TERM).
  602.  
  603.   call("list",TERML):-handle_list(TERML).
  604.  
  605.   call("edit",TERML):-handle_edit(TERML).
  606.  
  607. ifdef implement_trace
  608.   call("trace",_):-traceflag,!.
  609.   call("trace",_):-!,assert(traceflag).
  610.   call("notrace",_):-!,retractall(traceflag).
  611. enddef
  612.  
  613.   call("time",[int(H),int(M),int(S),int(HH)]):-!,
  614.     free(H),free(M),free(S),free(HH),
  615.     time(H,M,S,HH).
  616.  
  617.   call("scr_char",[int(ROW),int(COL),char(CHAR)]):-!,
  618.     bound(ROW), bound(COL),
  619.     scr_char(ROW,COL,CHAR).
  620.  
  621.   call("char_int",[char(CH),int(INT)]):-!,
  622.       char_int(CH,INT).
  623.  
  624.   call("consult",[TERM]):-!,
  625.     bound(TERM),getfilename(TERM,FILENAME),cons(FILENAME).
  626.  
  627.   call("reconsult",[TERM]):-!,
  628.     bound(TERM),getfilename(TERM,FILENAME),recons(FILENAME).
  629.  
  630.   call("save",[TERM]):-!,
  631.     bound(TERM),getfilename(TERM,FILENAME),sav(FILENAME).
  632.  
  633.   call("op",[int(PRIOR),atom(ASSOC),atom(OP)]):-!,
  634.     handle_op(PRIOR,ASSOC,OP).
  635.  
  636.   call(ID,TERML):-
  637.     getbacktrack(BTOP),
  638.     clause(cmp(ID,TERML1),BODY),
  639.     free(ENV),
  640.     unify_terml(TERML,TERML1,ENV),
  641.     unify_body(BODY,ENV,BTOP).
  642.