Prolog Lists PDF
Prolog Lists PDF
Antoni Ligeza
2011
[1] Ulf Nilsson, Jan Maluszynski: Logic, Programming and Prolog, John Wiley &
Sons Ltd., pdf, http://www.ida.liu.se/ ulfni/lpp
[t1 , t2 , . . . , tn ]
The order of elements of a list is important; the direct access is only to the first
element called the Head, while the rest forms the list called the Tail.
[Head|Tail]
Lists as Terms
Lists in fact are also terms. A list:
[t1 , t2 , . . . , tn ]
l/2 is the list constructor symbol and nil is symbolic denotation of empty list.
[H|T].
1 [H|T] = [a,b,c,d,e]
2 H=a, T = [b,c,d,e]
List properties
z A list can have as many elements as necessary.
z A list can be empty; an empty list is denoted as [ ].
z A list can have arguments being of:
1 mixed types,
2 complex structures, i.e. terms, lists, etc., and as a consequence
3 a list can have nested lists (to an arbitrary depth)
z a list of k elements can be matched directly against these elements, i.e.
1 [X,Y,Z,U,V] = [a,b,c,d,e]
2 X=a, Y=b, Z=c, U=d, V=e
Single-element list
A single-element list is different from its content-element!
foo 6= [foo]
First k-elements: k = 1, 2, 3
1 [X|_] = [a,b,c,d,e].
2 X=a
3
4 [_,X|_] = [a,b,c,d,e].
5 X=b
6
7 [_,_,X|_] = [a,b,c,d,e].
8 X=c
1 take(1,[H|_],H):- !.
2 take(N,[_|T],X):- N1 is N-1, take(N1,T,X).
Propagation of substitutions
1 [X,Y,Z,U] = [a,b,c,d] ?
2 [X,Y,Z,X] = [a,b,c,d] ?
3 [X,Y,Y,X] = [a,U,Q,U] ?
Lists as sets
1 [a,b,c,d,e]
2 [1,2,3,4,5,6,7,8,9]
3 [1,a,2,b,f(a),g(b,c)]
1 [a,b,c,d,e,a,c,e]
2 [1,1,2,3,4,5,6,7,8,9,2,7,1]
3 [1,a,2,b,f(a),g(b,c),b,1,f(a)]
Member/2
Checking if an item occurs within a list; deterministic version.
1 member(Element,[Element|_):- !.
2 member(Element,[_|Tail]):-
3 member(Element,Tail).
Member/2
Checking if an item occurs within a list; indeterministic version.
1 member(Element,[Element|_).
2 member(Element,[_|Tail]):-
3 member(Element,Tail).
Select/3
Selecting and item from a list indeterministic.
1 select(Element,[Element|Tail],Tail).
2 select(Element,[Head|Tail],[Head|TaiE]):-
3 select(Element,Tail,TaiE).
Append/3
The basic use of the append/3 predicate is to concatenate two lists.
1 append([],L,L).
2 append([H|T],L,[H|TL]) :- append(T,L,TL).
Concatenation Test
1 append([a,b],[c,d,e],[a,b,c,d,e]).
1 append(FL,[c,d,e],[a,b,c,d,e]).
2 FL = [a,b]
1 append([a,b],BL,[a,b,c,d,e]).
2 BL = [c,d,e]
1 append(FL,BL,[a,b,c,d,e])
2
3 FL = [],
4 BL = [a,b,c,d,e];
5
6 FL = [a],
7 BL = [b,c,d,e];
8
9 FL = [a,b],
10 BL = [c,d,e];
11
12 FL = [a,b,c],
13 BL = [d,e];
14
15 FL = [a,b,c,d],
16 BL = [e];
17
18 FL = [a,b,c,d,e],
19 BL = [];
20 false.
Length of a list
1 len([],0).
2 len([_|T],L):-
3 len(T,LT),
4 L is LT+1.
Sum of a list
1 sum([],0).
2 sum([H|T],S):-
3 sum(T,ST),
4 S is ST+H.
Write a list
1 writelist([]):- nl.
2 writelist([H|T]):-
3 write(H),nl,
4 writelist(T).
1 XL = [X|L].
1 putk(X,1,L,[X|L]):- !.
2 putk(X,K,[F|L],[F|LX]):- K1 is K-1, putk(X,K1,L,LX).
1 del(X,[X|L],L).
2 del(X,[Y|L],[Y|L1]):-
3 del(X,L,L1).
1 delall(_,[],[]):- !.
2 delall(X,[H|L],[H|LL]):- X \= H,!, delall(X,L,LL).
3 delall(X,[X|L],LL):- delall(X,L,LL).
1 sublist(S,FSL,F,L):- append(F,SL,FSL),append(S,L,SL).
1 subseq([],_):- !.
2 subseq([H|S],L):- append(_,[H|SL],L),!, subseq(S,SL).
Think!
1 N [1,2,3,...,N-1,N],
2 List: [1,2,3,4,5,6,7] all permutations,
3 K, [1,2,3,4,5,6,7] K-element comobinations,
4 Set: [1,2,3,4,5,6,7] all subsets,
5 ExchangeFL: [1,2,3,4,5,6,7] [7,2,3,4,5,6,1],
6 ShiftLCircular: [1,2,3,4,5,6,7] [2,3,4,5,6,7,1],
7 ShiftRCircular: [1,2,3,4,5,6,7] [7,1,2,3,4,5,6,7],
8 Split: [1,2,3,4,5,6,7] [1,3,5,7], [2,4,6],
9 Merge: [1,3,5,7], [2,4,6] [1,2,3,4,5,6,7],
10 Split C=4: [1,2,3,4,5,6,7] [1,2,3],[4],[5,6,7],
11 p1. p2. ... pK. [p1,p2,...,pK].
Think!
z Recursion Iterations,
z Recursion repeat-fail.
1 insert(X,L,LX):- del(X,LX,L).
2
3 perm([],[]).
4 perm([H|T],P):-
5 perm(T,T1),
6 insert(H,T1,P).
1 sorted([]):- !. sorted([_]):- !.
2 sorted([X,Y|T]) :- X =< Y, sorted([Y|T]).
Slow Sort
1 slowsort(L,S):-
2 perm(L,S),
3 sorted(S).
1 reverse([],[]).
2 reverse([X|L],R):-
3 reverse(L,RL),
4 append(RL,[X],R).
1 inverse(L,R):-
2 do([],L,R).
3 do(L,[],L):-!.
4 do(L,[X|T],S):-
5 do([X|L],T,S).
Accumulator
[a,b,c], [d,e,f,g] [d,c,b,a], [e,f,g]
1 subset([],_).
2 subset([X|L],Set):-
3 member(X,Set),
4 subset(L,Set).
5 intersect([],_,[]).
6 intersect([X|L],Set,[X|Z]):-
7 member(X,Set),!,
8 intersect(L,Set,Z).
9 intersect([X|L],Set,Z):-
10 not(member(X,Set)),
11 intersect(L,Set,Z).
12 union([],Set,Set).
13 union([X|L],Set,Z):-
14 member(X,Set),!,
15 union(L,Set,Z).
16 union([X|L],Set,[X|Z]):-
17 not(member(X,Set)),!,
18 union(L,Set,Z).
19 difference([],_,[]).
20 difference([X|L],Set,[X|Z]):-
21 not(member(X,Set)),!,
22 difference(L,Set,Z).
23 difference([_|L],Set,Z):- difference(L,Set,Z).