List process- handling sequences of elements - is a powerful technique in prolog.

Prolog uses brackets [...] as list builder. The notation [X|Y] represents a list whose first element is X and Y as its tail. A finite list can be explicitly enumerated, such as, [1,2,3,4].

Declaring lists

Here is how you declare a domain for list of integers.

domains
list=integer*

Similarly you may also declare symbol* or real*.

Predicates

member(integer,list)

delete(integer,list,list)

append(list,list,list)

reverse(list,list)

perm(list,list)

subset(list,list)

union(list,list,list)

intersection(list,list,list)

mergesort(list,list)

split(list,list,list)

merge(list,list,list)

Clauses

member(X,[X|R]).

member(X,[Y|R]):-X<>Y,member(X,R).

delete(X,[X|R],R).

delete(X,[H|T],[H|S]):-delete(X,T,S).

append([],X,X).

append([H|T],Z,[H|S]):-append(T,Z,S).

reverse([],[]).

reverse([H|X],Y):-reverse(X,Z),append(Z,[H],Y).

perm([],[]).

perm([X|Y],Z):-perm(Y,W),delete(X,Z,W).

subset([],_).

subset([H|T],S):-member(H,S),subset(T,S).

union([],Z,Z).

union([H|T],X,Y):-member(H,X),union(T,X,Y).

union([H|T],X,[H|Y]):-not(member(H,X)),union(T,X,Y).

intersection([],X,[]).

intersection([H|T],X,[H|Y]):-member(H,X),intersection(T,X,Y).

intersection([H|T],X,Y):-not(member(H,X)),intersection(T,X,Y).

mergesort([],[]).

mergesort([A],[A]).

mergesort([A,B|T],S):-split([A,B|T],L1,L2),mergesort(L1,S1),mergesort(L2,S2),merge(S1,S2,S)

split([],[],[]).

split([A],[A],[]).

split([A,B|R],[A|Ra],[B|Rb]):-split(R,Ra,Rb).

merge(A,[],A).

merge([],B,B).

merge([A|Ra],[B|Rb],[A|M]):-A=<B,merge(Ra,[B|Rb],M).

merge([A|Ra],[B|Rb],[B|M]):-A>B,merge([A|Ra],Rb,M).