| OCR Text |
Show reduce_one(E, E) :atom( E); integer(E); reduce_one(call(E), R) :reduce_ one(E, R). reduce_one(E, R) :- E =·· [FunctoriArgs], 137 var(E), !. I* One_Step_Reduction *I I* get rid of "call" which *I I* is generated by Prolog *I I* E is reducible *I (built_in(Functor, Args, RR) -> I* for built-in functions *I R = RR; (get_clause((E ==> RHS), (Lt ==> Rt)), assert(:-(Lt, Rt), Ref), clause(E, R), retract(:-(Lt, Rt)))). reduce_one(E, R) :- E =·· [FunctoriArgs], !, reduce_inner(Args, NewArgs), EE -·· [FunctoriNewArgs], (E \== EE -> EE = R; E = R). get_clause(LHS, Head) :- I* substitution *I I* E is not reducible, *I I* go reduce inner terms *I clause(LHS, , Ref), clause(Head, , Ref). I* "reduce" serves as an interpreter for function reductions *I reduce(E, E) :- atom(E); integer(E); var(E), !. reduce([E], R) :- !, reduce(E, R). reduce(E, R) :- !, reduce_one(E, EE), EE =·· [FunctoriArgs], (E \== EE -> reduce(EE, R); E = R), !. I* An example of built-in system functions *I built_in(Functor, Args, R) (Functor == equal -> ( (Args = [A, B], reduce(A, A1), reduce(B, B1), I* equal(A, B) if A and B *I I* reduce to the same term *I A1 = B1) -> R = true; R = false)); (Functor == eq -> I* identity boolean *I ((Args = [A, B], I* function eq *I A == B) -> R =true; R =false)); false. |