190 likes | 366 Views
List processing in Prolog. t.k.prasad@wright.edu http://www.knoesis.org/tkprasad/. List Structures. List containing elements a, b, and c (in that order): [a, b , c] [a | [b, c]] [a, b | [c] ]. element separator. cons operator. (cont’d).
E N D
List processing in Prolog t.k.prasad@wright.edu http://www.knoesis.org/tkprasad/ L4ListProcessing
List Structures • List containing elements a, b, and c (in that order): [a, b, c] [a | [b, c]] [a, b | [c] ] element separator cons operator L4ListProcessing
(cont’d) • List containing elements a, b, and c (in that order): .(a, .(b, .(c, []))) special list functor for cons empty list L4ListProcessing
Membership Test: Scheme vs Prolog (define (member e lis) (cond ((null? lis) #f) ((eq? e (car lis)) #t ) (else (member e (cdr lis))))) > (member 'a '(1 21 2)) #f member(E, [E|_]). member(E, [_|L]) :- member(E,L). ?- member(1,[12,1,3]). true ; L4ListProcessing
Cartesian Product • cart([],_,[]). • cart([HA|TA],B,AB) :- • pair(HA,B,C), • cart(TA,B,D), • append(C,D,AB). • pair(_,[],[]). • pair(HA,[HB|TB],[(HA,HB)|R]) :- • pair(HA,TB,R). L4ListProcessing
Permutations • [a,b] ->permute-> [[a,b], [b,a]] • [a,b,c] ->permute-> [[c,a,b],[a,c,b],[a,b,c]] [[c,b,a],[b,c,a],[b,a,c]] L4ListProcessing
permutation([],[]). • permutation([H|T],P) :- • permutation(T,Q), • insert(H,Q,P). • insert(H,Q,[H|Q]). • insert(H,[S|R],[S|T]) :- • insert(H,R,T). • /*Generate all permutations through backtracking */ • ?-setof(X,permutation([1,2,3],X),R). • R = [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]. L4ListProcessing
Collection Predicates p(a,b). p(b,b). p(c,b). p(e,d). p(a,d). p(a,a). /* collect all values of X for each Y */ ?-setof(X,p(X,Y),S). Y = a, S = [a] ; Y = b, S = [a, b, c] ; Y = d, S = [a, e]. L4ListProcessing
(cont’d) p(a,b). p(b,b). p(c,b). p(e,d). p(a,d). p(a,a). /* collect all values of Y for which an X exists */ ?-setof(Y,X^p(X,Y),S). S = [a, b, d] ; ordered, no dups L4ListProcessing
(cont’d) p(a,b). p(b,b). p(c,b). p(e,d). p(a,d). p(a,a). /* collect all values of X for each Y */ ?-bagof(X,p(X,Y),S). Y = a, S = [a] ; Y = b, S = [a, b, c] ; Y = d, S = [e, a]. L4ListProcessing
(cont’d) p(a,b). p(b,b). p(c,b). p(e,d). p(a,d). p(a,a). /* collect all values of Y for which an X exists */ ?-bagof(Y,X^p(X,Y),S). S = [b, b, b, d, d, a]. unordered, dups present L4ListProcessing
(cont’d) p(a,b). p(b,b). p(c,b). p(e,d). p(a,d). p(a,a). /* collect all values of X for which a Y exists , in order*/ ?-findall(X,p(X,Y),S). S = [a, b, c, e, a, a]. /* Free variables existentially quantified by default. */ ?-findall(Y,X^p(X,Y),S). S = [b, b, b, d, d, a]. L4ListProcessing
Operators • Normal syntax of a term : prefix form f(g(x,Y),5) • Normal syntax of an expression with operators : infix form x * Y + 5 • Besides operator name and arity, the following information is necessary to disambiguate expressions containing operators. • Associativity • Precedence • Fixity (prefix/infix/postfix) L4ListProcessing
Operator Declaration :- op(precedence, type, name). Examples: :- op( 1200, xfx, [ :-, --> ]). :- op(500, yfx, [ +, - ]). :- op( 500, fx, [ +, - ]). :- op(900, fy, [ \+ ]). Higher precedence class => Lower binding strength INFIX • x f y : Right-associative • y f x : Left-associative • x f x : Non-associative PREFIX • f x : Non-associative • f y : Right-associative POSTFIX • x f : Non-associative • y f : Left-associative L4ListProcessing
| 1200 |xfx |-->, :- | | 1200 | fx |:-, ?- | | 1150 | fx |dynamic, discontiguous, initialization, mod- | | | |ule_transparent, multifile, thread_local,| | | |volatile | | 1100 |xfy |;, | | | 1050 |xfy |->, op*-> | | 1000 |xfy |, | | 900 | fy |\+ | | 900 | fx |~ | | 700 |xfx |<, =, =.., =@=, =:=, =<, ==, =\=, >, >=, @<, | | | |@=<, @>, @>=, \=, \==, is | | 600 |xfy |: | | 500 | yfx |+, -, /\, \/, xor | | 500 | fx |? | | 400 | yfx |*, /, //, rdiv, <<, >>, mod, rem | | 200 |xfx |** | | 200 |xfy |^ | |__200_|_fy__|+,_-,_\________________________________________|_ Table 4.1: Predefined system operators L4ListProcessing
Examples : “Term Disambiguation” • p; q; r • p :- q :- r • :- :- p • \+ \+ p • a + b + c • a ^ b ^ c • a – b / c • p;(q;r) • Illegal • Illegal • \+ (\+ p) • (a + b) + c • a ^ ( b ^ c) • a – ( b / c ) L4ListProcessing
Exercise p :- a, b -> c ; d. p :- (a, (b -> c ; d)). vs p :- (((a, b) -> c) ; d). q :- b -> c ; d , a. q :-(b -> (c ; (d , a))). vs q :-((b -> c) ; (d , a)). L4ListProcessing