Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Path: utzoo!utgpu!water!watnot!watmath!clyde!rutgers!seismo!vrdxhq!verdix!ogcvax!schaefer From: schaefer@ogcvax.UUCP Newsgroups: comp.lang.prolog Subject: Re: Prolog control structures Message-ID: <1239@ogcvax.UUCP> Date: Fri, 3-Apr-87 14:10:08 EST Article-I.D.: ogcvax.1239 Posted: Fri Apr 3 14:10:08 1987 Date-Received: Sun, 5-Apr-87 10:41:51 EST References: Reply-To: schaefer@ogcvax.UUCP (Barton E. Schaefer) Organization: Oregon Graduate Center, Beaverton, OR Lines: 29 Summary: Copy predicate In article mcvax!unido!ecrcvax!micha (Micha Meier) writes: >[...] >Not to forget the definition of succeeds/1: > succeeds(X) :- not(not(X)). >or alternatively > succeeds(X) :- replace_vars(X, Y), Y, !. >where replace_vars(X, Y) makes a copy of X with fresh variables. >[...] >--Micha The replace_vars predicate can be implemented as: replace_vars(X,Y) :- copy1(X,Y,T), !. copy1(X,Y,Tbl) :- var(X), member((X,Y),Tbl). copy1(X,X,Tbl) :- atomic(X). copy1([H|T],[H1|T1],Tbl) :- copy1(H,H1,Tbl), copy1(T,T1,Tbl). copy1((F,S),(F1,S1),Tbl) :- copy1(F,F1,Tbl), copy1(S,S1,Tbl). copy1(X,Y,Tbl) :- not atomic(X), X =.. [F|R], copy1(R,R1,Tbl), Y =.. [F|R1]. member((X,Y),[(X1,Y)|R]) :- X == X1. member(E,[E1|R]) :- var(E1), E1 = E. member(E,[_|R]) :- member(E,R). -- Bart Schaefer Dept. of CS&E CSNET: schaefer@Oregon-Grad Oregon Graduate Center UUCP: {ihnp4,seismo,sun}!verdix \ 19600 NW Von Neumann Dr {hplabs,ucbvax,decvax}!tektronix !ogcvax!schaefer Beaverton, OR 97006