/* File: LIB.PRO, Mohsin Ahmed, 1988 * SYNOPSIS: misc prolog predicates. * GPL(C) Mohsin Ahmed, http://www.cs.albany.edu/~mosh */ /* List of Predicates: */ /* member(L,L) */ /* islist(T) */ /* append(L,L,L) */ /* pp(T) */ /* last(T,L) */ /* reverse(L,L) */ /* efface(E,L,L) */ /* delete(E,L,L) */ /* subst(E,L,E,L) */ /* subset(E,L) */ /* intersecion(L,L,L) */ /* union(L,L,L) */ /* hanoi(N) */ /* replace(T,T,T,T) */ /* Where: T term, L list, */ /* N number, E element */ member(X,[X|_]). member(X,[_|Y]) :- member(X,Y). islist(X) :- var(X), !, fail. islist([A|B]) :- islist(B). islist([]). append([],L,L). append([X|L1],L2,[X|L3]) :- append(L1,L2,L3). pp(X) :- pp(X,0). pp([H|T],I) :- !, J is I+3, pp(H,J), ppx(T,J), nl. pp(X,I) :- tab(I), write(X), nl. ppx([],_). ppx([H|T],I) :- pp(H,I), ppx(T,I). last(X,[X]). last(X,[_|Y]) :- last(X,Y). reverse( L1, L2 ) :- reverse( L1, [], L2 ). reverse( [], Stack, Stack ). reverse( [H|T], Stack, Out ) :- reverse( T, [H|Stack], Out ). /* reverse([],[]). reverse([H|T],L) :- reverse(T,Z), append(Z,[H],L). */ efface(_,[],[]). efface(A,[A|L],L) :- !. efface(A,[B|L],[B|M]) :- efface(A,L,M). delete(_,[],[]). delete(X,[X|L],M) :- !, delete(X,L,M). delete(X,[Y|L1],[Y|L2]) :- delete(X,L1,L2). subst(_,[],_,[]). subst(X,[X|L],A,[A|M]) :- !, subst(X,L,A,M). subst(X,[Y|L],A,[Y|M]) :- subst(X,L,A,M). subset([A|X],Y) :- member(A,Y), subset(X,Y). subset([],Y). intersection([],X,[]). intersection([X|R],Y,[X|Z]) :- member(X,Y), !, intersection(R,Y,Z). intersection([X|R],Y,Z) :- intersection(R,Y,Z). union([],X,X). union([X|R],Y,Z) :- member(X,Y), !, union(R,Y,Z). union([X|R],Y,[X|Z]) :- union(R,Y,Z). hanoi(N) :- hanoi1(N,1,2,3). hanoi1(0,_,_,_) :- !. hanoi1(N,A,B,C) :- M is N-1, hanoi1(M,A,C,B), write([A,' -> ',B]), nl, hanoi1(M,C,B,A). /* replace_var(var,var_value,old,new) */ replace(I,V,I,V) :- !. replace(_,_,I,I) :- atomic(I), !. replace(_,_,[],[]) :- !. replace(I,V,[H|T],[NH|NT]) :- replace(I,V,H,NH), replace(I,V,T,NT), !. replace(I,V,F,N_F) :- F =.. [C|P], replace(I,V,C,N_C), replace(I,V,P,N_P), N_F =.. [N_C|N_P], !. replace(_,_,Z,Z) :- !. /*---------------------------------------------------------------- reverse( list-in:i, list-out:o ). No Append reqd. reverse( list-in:i, stack-to-push-list-in:i, list-out:o ). ----------------------------------------------------------------*/ reverse( L1, L2 ):- reverse( L1, [], L2 ). reverse( [], Stack, Stack ). reverse( [H|T], Stack, Out ):- reverse( T, [H|Stack], Out ).