List processing in Prolog t k prasadwright edu

  • Slides: 17
Download presentation
List processing in Prolog t. k. prasad@wright. edu http: //www. knoesis. org/tkprasad/ cs 774

List processing in Prolog t. k. prasad@wright. edu http: //www. knoesis. org/tkprasad/ cs 774 (Prasad) L 4 List. Processing 1

List Structures • List containing elements a, b, and c (in that element separator

List Structures • List containing elements a, b, and c (in that element separator order): [a, b, c] [a | [b, c]] [a, b | [c] ] cons operator cs 774 (Prasad) L 4 List. Processing 2

(cont’d) • List containing elements a, b, and c (in that order): special list

(cont’d) • List containing elements a, b, and c (in that order): special list functor for cons . (a, . (b, . (c, []))) empty list cs 774 (Prasad) L 4 List. Processing 3

Membership Test: Scheme vs Prolog (define (member e lis) (cond ((null? lis) #f) ((eq?

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 ; cs 774 (Prasad) L 4 List. Processing 4

Cartesian Product cart([], _, []). cart([HA|TA], B, AB) : pair(HA, B, C), cart(TA, B,

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). cs 774 (Prasad) L 4 List. Processing 5

Permutations • [a, b] ->permute-> [[a, b], [b, a]] • [a, b, c] ->permute->

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]] cs 774 (Prasad) L 4 List. Processing 6

permutation([], []). permutation([H|T], P) : permutation(T, Q), insert(H, Q, P). insert(H, Q, [H|Q]). insert(H,

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]]. cs 774 (Prasad) L 4 List. Processing 7

Collection Predicates p(a, b). p(b, b). p(c, b). p(e, d). p(a, a). cs 774

Collection Predicates p(a, b). p(b, b). p(c, b). p(e, d). p(a, a). cs 774 (Prasad) /* 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]. L 4 List. Processing 8

(cont’d) p(a, b). p(b, b). p(c, b). p(e, d). p(a, a). cs 774 (Prasad)

(cont’d) p(a, b). p(b, b). p(c, b). p(e, d). p(a, a). cs 774 (Prasad) /* collect all values of Y for which an X exists */ ? -setof(Y, X^p(X, Y), S). S = [a, b, d] ; ordered, no dups L 4 List. Processing 9

(cont’d) p(a, b). p(b, b). p(c, b). p(e, d). p(a, a). cs 774 (Prasad)

(cont’d) p(a, b). p(b, b). p(c, b). p(e, d). p(a, a). cs 774 (Prasad) /* 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]. L 4 List. Processing 10

(cont’d) p(a, b). p(b, b). p(c, b). p(e, d). p(a, a). cs 774 (Prasad)

(cont’d) p(a, b). p(b, b). p(c, b). p(e, d). p(a, a). cs 774 (Prasad) /* 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 L 4 List. Processing 11

(cont’d) p(a, b). p(b, b). p(c, b). p(e, d). p(a, a). cs 774 (Prasad)

(cont’d) p(a, b). p(b, b). p(c, b). p(e, d). p(a, a). cs 774 (Prasad) /* 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]. L 4 List. Processing 12

Operators • Normal syntax of a term : prefix form f(g(x, Y), 5) •

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) cs 774 (Prasad) L 4 List. Processing 13

 • • INFIX x f y : Right-associative y f x : Left-associative

• • 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 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 cs 774 (Prasad) L 4 List. Processing 14

| 1200 |xfx | 1200 | fx | 1150 | fx | | |-->,

| 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: cs 774 (Prasad) Predefined system operators L 4 List. Processing 15

Examples : “Term Disambiguation” • • p; q; r p : - q :

Examples : “Term Disambiguation” • • p; q; r p : - q : - r : - p + + p a + b + c a ^ b ^ c a – b / c cs 774 (Prasad) • • p; (q; r) Illegal + (+ p) (a + b) + c a ^ ( b ^ c) a – ( b / c ) L 4 List. Processing 16

Exercise p : - a, b -> c ; d. p : - (a,

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)). cs 774 (Prasad) L 4 List. Processing 17