0% found this document useful (0 votes)
208 views

Prolog Lists PDF

The document discusses lists in Prolog. It begins with an introduction to basic list concepts and notation in Prolog. It then discusses lists as terms and various list operations and predicates including member/2, select/3, append/3 and their applications. The document also discusses representing lists as sequences, sets and bags and provides examples of common list processing tasks like length, sum, and element insertion/deletion.

Uploaded by

tina_5432005
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
208 views

Prolog Lists PDF

The document discusses lists in Prolog. It begins with an introduction to basic list concepts and notation in Prolog. It then discusses lists as terms and various list operations and predicates including member/2, select/3, append/3 and their applications. The document also discusses representing lists as sequences, sets and bags and provides examples of common list processing tasks like length, sum, and element insertion/deletion.

Uploaded by

tina_5432005
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 17

P ROLOG.

Lists in P ROLOG. Operations and Predicates.


Lists as Sequences, Sets, Bags. Meta Predicates.

Antoni Ligeza

Katedra Automatyki, AGH w Krakowie

2011

Antoni Ligeza Prolog 1/17


References

[1] Ulf Nilsson, Jan Maluszynski: Logic, Programming and Prolog, John Wiley &
Sons Ltd., pdf, http://www.ida.liu.se/ ulfni/lpp

[2] Dennis Merritt: Adventure in Prolog, Amzi, 2004


http://www.amzi.com/AdventureInProlog

[3] Quick Prolog:


http://www.dai.ed.ac.uk/groups/ssp/bookpages/quickprolog/quickprolog.html

[4] W. F. Clocksin, C. S. Mellish: Prolog. Programowanie. Helion, 2003

[5] SWI-Prologs home: http://www.swi-prolog.org

[6] Learn Prolog Now!: http://www.learnprolognow.org

[7] http://home.agh.edu.pl/ ligeza/wiki/prolog

[8] http://www.im.pwr.wroc.pl/ przemko/prolog

Antoni Ligeza Prolog 2/17


Introduction to Lists in Prolog

Lists - basic concepts


z Lists are one of the most important structures in symbolic languages.
z In most of the implementations of P ROLOG lists are standard, build-in structures
and there are numerous operations on them provided as routine predicates.
z Lists can be used to represent
1 sets,
2 sequences,
3 multi-sets (bags), and
4 more complex structures, such as trees, records, nested lists, etc.

Lists - basic notation


A list in P ROLOG is a structure of the form

[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]

where Head is a single element, while Tail is a list.

Antoni Ligeza Prolog 3/17


Definition of Lists. Lists as Terms

Lists as Terms
Lists in fact are also terms. A list:

[t1 , t2 , . . . , tn ]

is equivalent to a term defined as follows:

l(t1 , l(t2 , . . . l(tn , nil) . . .))

l/2 is the list constructor symbol and nil is symbolic denotation of empty list.

Lists: Head and Tail


In practical programming it is convenient to use the bracket notation. In order to
distinguish the head and the tail of a list the following notation is used

[H|T].

An example of list matching

1 [H|T] = [a,b,c,d,e]
2 H=a, T = [b,c,d,e]

Antoni Ligeza Prolog 4/17


Some Notes on lists. Unification Variants

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

z first k elements of any list can be matched directly


1 [X,Y,Z|T] = [a,b,c,d,e]
2 X=a, Y=b, Z=c, T=[d,e]

Single-element list
A single-element list is different from its content-element!

foo 6= [foo]

Antoni Ligeza Prolog 5/17


First k elements. The n-th element. Propagation of Substitutions

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

Take the n-th element

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] ?

Antoni Ligeza Prolog 6/17


Applications of Lists: Examples

List understanding: three basic possibilities


z as sequences,
z as sets,
z as sets with repeated elements,
When thinking of lists as sets, the order of elements is (read: must be made)
unimportant.

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)]

Lists as multi-sets (bags, collections) or sequences

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)]

Repeated elements can occur.

Antoni Ligeza Prolog 7/17


Member/2 and Select/3 Predicates

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).

Antoni Ligeza Prolog 8/17


Lists as Sequences: the Beauty of the Append/3 Predicate

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]).

Finding Front List

1 append(FL,[c,d,e],[a,b,c,d,e]).
2 FL = [a,b]

Finding Back List

1 append([a,b],BL,[a,b,c,d,e]).
2 BL = [c,d,e]

Antoni Ligeza Prolog 9/17


Append/3 Indeterministic List Decomposition

Indeterministic List Decomposition

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.

Antoni Ligeza Prolog 10/17


Basic Recurrent Operations: length, sum, writing a list

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).

Antoni Ligeza Prolog 11/17


Putting and Deleting Elements to/form a List

Put X as the first element to L

1 XL = [X|L].

Put X as the k-th element to 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).

Delete one X from L (indeterministic!)

1 del(X,[X|L],L).
2 del(X,[Y|L],[Y|L1]):-
3 del(X,L,L1).

Delete all X from L

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).

Antoni Ligeza Prolog 12/17


Lists and sublists. Nested Lists. Flatten List

A list and a sublist


[1,2,3,4,5,6,7,8,9]
[3,4,5,6]

Checking for a sublist

1 sublist(S,FSL,F,L):- append(F,SL,FSL),append(S,L,SL).

A list and a subsequence


[1,2,3,4,5,6,7,8,9]
[3,5,8]

Checking for subsequence

1 subseq([],_):- !.
2 subseq([H|S],L):- append(_,[H|SL],L),!, subseq(S,SL).

Nested lists. Flatten a list


[1,[2,3],4,[5,[6,7],8],9] [1,2,3,4,5,6,7,8,9]
Antoni Ligeza Prolog 13/17
Lists: some small challenges

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.

Antoni Ligeza Prolog 14/17


Inserting List Element. Permutations.

Insert (indeterministic!). Permutations: insert

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).

Sorted List Definition

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).

Antoni Ligeza Prolog 15/17


Reverse List. Inverse List

Naive List Reverse

1 reverse([],[]).
2 reverse([X|L],R):-
3 reverse(L,RL),
4 append(RL,[X],R).

Iterative List Inverting: Accumulator

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]

Antoni Ligeza Prolog 16/17


Lists as Sets: Basic Operations

Set Algebra Operations

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).

Antoni Ligeza Prolog 17/17

You might also like