prolog as a meta-languagegwiener/wp-content/... · prologasameta-language guywiener sayeret lambda...

100
Prolog as a Meta-Language Guy Wiener Sayeret Lambda July 14, 2010 Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 1 / 86

Upload: others

Post on 22-Jan-2021

6 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Prolog as a Meta-Language

Guy Wiener

Sayeret Lambda

July 14, 2010

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 1 / 86

Page 2: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Disclaimer

Prolog is:Well-unknownDomain-specificInefficient

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 2 / 86

Page 3: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Outline

1 Introduction to Prolog

2 Functional Prolog

3 Prolog as an Interpreter

4 Prolog for Software Modeling

5 Prolog Libs and Tricks

6 Summary

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 3 / 86

Page 4: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Intro

Outline

1 Introduction to Prolog

2 Functional Prolog

3 Prolog as an Interpreter

4 Prolog for Software Modeling

5 Prolog Libs and Tricks

6 Summary

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 4 / 86

Page 5: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Intro Terms

Outline

1 Introduction to PrologTermsUnificationQueriesRulesCuttingTerm ExpansionSummary

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 5 / 86

Page 6: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Intro Terms

Grounded Atomic Terms

Numbers 1, 2, 3.14. . .Atoms foo, bar, ’Baz’

Characters $a, $b, $c

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 6 / 86

Page 7: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Intro Terms

Grounded Composite Terms

Functors func(a, b, 5)

Lists [a, b, 5], [1, 2 | ...]Strings "some text"

Operators 3 + 4, foo @> goo

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 7 / 86

Page 8: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Intro Terms

Grounded Composite Terms

Functors func(a, b, 5)Lists [a, b, 5], [1, 2 | ...]

Strings "some text"Operators 3 + 4, foo @> goo

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 7 / 86

Page 9: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Intro Terms

Ungrounded Terms

Variables X, Y, Foo, GOO, _, _AComposites func(X, Y, 5), [1, 2 | Rest]

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 8 / 86

Page 10: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Intro Unification

Outline

1 Introduction to PrologTermsUnificationQueriesRulesCuttingTerm ExpansionSummary

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 9 / 86

Page 11: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Intro Unification

Unifying Grounded Terms

1 = 1, foo = foo

1 \= 2, foo \= goo

func(a, b, 5) = func(a, b, 5)

func(a, b, 5) \= func(a, c, 5)

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 10 / 86

Page 12: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Intro Unification

Unifying Ungrounded Terms

X = 1, Y = foo(bar(5))

foo(X, goo(4)) = foo(a, Y) ⇒X = a, Y = goo(4)

[1, 2, 3] = [X | Rest] ⇒X = 1, Rest = [2, 3]

foo(1, 2) \= foo(X, X)

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 11 / 86

Page 13: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Intro Unification

The Reflection Operator

func(a, b, c) =.. [func, a, b, c]

func(a, b, c) =.. [F | Args] ⇒F = func, Args = [a, b, c]

F =.. [foo, bar, X] ⇒ F = foo(bar, X)

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 12 / 86

Page 14: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Intro Unification

Arithmetic

X is 2 + 3 ⇒ X = 5

5 is X + 3 ⇒ false

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 13 / 86

Page 15: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Intro Queries

Outline

1 Introduction to PrologTermsUnificationQueriesRulesCuttingTerm ExpansionSummary

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 14 / 86

Page 16: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Intro Queries

Programs and Queries

Programextends(man, person).extends(woman, person).consists(couple, man).consists(couple, woman).

Queries?- extends(man, X).X = person

?- extends(X, person).X = man ;X = woman

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 15 / 86

Page 17: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Intro Queries

And-Queries

Programextends(man, person).extends(woman, person).consists(couple, man).consists(couple, woman).

Queries?- consists(couple, X) , extends(X, Y).X = man, Y = person ;X = woman, Y = person

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 16 / 86

Page 18: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Intro Queries

And-Queries

Programextends(man, person).extends(woman, person).consists(couple, man).consists(couple, woman).

Queries?- consists(couple, X), consists(couple, Y),

X \= Y.X = man, Y = woman

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 16 / 86

Page 19: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Intro Queries

Or-Queries

Programextends(man, person).extends(woman, person).consists(couple, man).consists(couple, woman).

Queries?- extends(man, X) ; consists(X, man).X = person ;X = couple

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 17 / 86

Page 20: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Intro Queries

Queries

Programextends(man, person).extends(woman, person).consists(couple, man).consists(couple, woman).

Queries?- (extends(man, X) ; consists(X, man)) ,

extends(woman, X).X = person

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 18 / 86

Page 21: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Intro Queries

Operators are Functors Too

Program:- op(xfx, 300, |>).

man |> person.woman |> person.

Queries?- X |> Y.X = man, Y = person ;X = woman, Y = person

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 19 / 86

Page 22: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Intro Rules

Outline

1 Introduction to PrologTermsUnificationQueriesRulesCuttingTerm ExpansionSummary

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 20 / 86

Page 23: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Intro Rules

Rules

Program% ...as beforeextends(boy, man).

subtype(X, Y) :- extends(X, Y).subtype(X, Y) :- extends(X, Z), subtype(Z, Y).

Queries?- subtype(X, person).X = man ; X = woman ;X = boy

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 21 / 86

Page 24: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Intro Rules

Rules

Programextends(item, element).extends(bucket, element).consists(bucket, element).

composite(Comp, Base) :-subtype(Comp, Base),consists(Comp, Base).

Query?- composite(X, Y).X = bucket,Y = element.

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 22 / 86

Page 25: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Intro Cutting

Outline

1 Introduction to PrologTermsUnificationQueriesRulesCuttingTerm ExpansionSummary

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 23 / 86

Page 26: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Intro Cutting

The Notorious Cut

The ‘!’ operatorDo not retry previous goalsDo not try subsequent clauses

Exampletype(X, v) :- var(X).type(X, a) :- atom(X).type(_, f).

?- type(a, T).T = a ;T = f

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 24 / 86

Page 27: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Intro Cutting

The Notorious Cut

The ‘!’ operatorDo not retry previous goalsDo not try subsequent clauses

Exampletype(X, v) :- var(X) !.type(X, a) :- atom(X) !.type(_, f).

?- type(a, T).T = a ;

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 24 / 86

Page 28: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Intro Term Expansion

Outline

1 Introduction to PrologTermsUnificationQueriesRulesCuttingTerm ExpansionSummary

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 25 / 86

Page 29: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Intro Term Expansion

Term Expansion

Macro definitionterm_expansion(recursive(R, P),

[(Head :- CallP1),(Head :- CallP2, CallR)]) :-

Head =.. [R, X, Y],CallP1 =.. [P, X, Y],CallP2 =.. [P, X, Z],CallR =.. [R, Z, Y].

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 26 / 86

Page 30: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Intro Term Expansion

Term Expansion

Sourcerecursive(subtype,

extends).

Expandedsubtype(X, Y) :-extends(X, Y).

subtype(X, Y) :-extends(X, Z),subtype(Z, Y).

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 27 / 86

Page 31: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Intro Summary

Outline

1 Introduction to PrologTermsUnificationQueriesRulesCuttingTerm ExpansionSummary

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 28 / 86

Page 32: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Intro Summary

Summary of Prolog Terminology

foo(goo, X, bar(Elem))

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 29 / 86

Page 33: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Intro Summary

Summary of Prolog Terminology

Atoms

foo(goo, X, bar(Elem))

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 29 / 86

Page 34: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Intro Summary

Summary of Prolog Terminology

foo(goo, X, bar(Elem))

VariablesGuy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 29 / 86

Page 35: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Intro Summary

Summary of Prolog Terminology

functor

foo(goo, X, bar(Elem))

functorGuy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 30 / 86

Page 36: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Intro Summary

Summary of Prolog Terminology

subtype(X, Y) :-extends(X, Z),subtype(Z, Y).

Head

Body Goals

Operator

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 31 / 86

Page 37: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Intro Summary

Summary of Prolog Terminology

extends(man, person).extends(woman, person).extends(boy, man).

subtype(X, Y) :-extends(X, Y).

subtype(X, Y) :-extends(X, Z),subtype(Z, Y).

Facts

Rules

Clauses

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 32 / 86

Page 38: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Intro Summary

Summary of Prolog Terminology

extends(man, person).extends(woman, person).extends(boy, man).

subtype(X, Y) :-extends(X, Y).

subtype(X, Y) :-extends(X, Z),subtype(Z, Y).

extends/2

subtype/2

Predicates

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 32 / 86

Page 39: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Functional Prolog

Outline

1 Introduction to Prolog

2 Functional Prolog

3 Prolog as an Interpreter

4 Prolog for Software Modeling

5 Prolog Libs and Tricks

6 Summary

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 33 / 86

Page 40: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Functional Prolog Variables as Goals

Outline

2 Functional PrologVariables as GoalsFinding All SolutionsFailure as Negation

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 34 / 86

Page 41: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Functional Prolog Variables as Goals

How Two Things are Related?

Programrelated(R, X, Y) :-

P =.. [R, X, Y], % P = R(X, Y)P. % Call P

Query?- related(extends, X, Y).X = man, Y = person ;X = woman, Y = person ;...

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 35 / 86

Page 42: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Functional Prolog Variables as Goals

How Two Things are Related?

Programrelated(R, X, Y) :-

call(R, X, Y).

Query?- related(extends, X, Y).X = man, Y = person ;X = woman, Y = person ;...

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 35 / 86

Page 43: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Functional Prolog Variables as Goals

How Two Things are Related?

Program

relation(extends).relation(consists).relation(subtype)

related(R, X, Y) :-relation(R),call(R, X, Y).

Query?- related(R, boy, person).R = subtype

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 36 / 86

Page 44: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Functional Prolog Variables as Goals

How Two Things are Related?

Programrelation(extends).relation(consists).relation(subtype)object(person).object(couple). % etc.

related(R, X, Y) :-relation(R),object(X),object(Y),call(R, X, Y).

Query?- related(R, X, Y).R = consists, X = couple, Y = man ;...

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 37 / 86

Page 45: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Functional Prolog Variables as Goals

Curried Call

Query?- call(consists(couple), X).X = man ;X = woman

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 38 / 86

Page 46: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Functional Prolog Variables as Goals

Curried Call

Query?- call(consists(couple), X).X = man ;X = woman

call appends the arguments tothe functor

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 38 / 86

Page 47: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Functional Prolog Finding All Solutions

Outline

2 Functional PrologVariables as GoalsFinding All SolutionsFailure as Negation

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 39 / 86

Page 48: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Functional Prolog Finding All Solutions

Finding All Solutions

Meta-Predicatesfindall(Template, Goal, Bag)

bagof(Template, Goal, Bag)

setof(Template, Goal, Bag)

findall example

?- findall(X, extends(X, person), Xs).Xs = [man, woman].

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 40 / 86

Page 49: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Functional Prolog Finding All Solutions

List Processing

List meta-predicatesmaplist(Pred, List1, List2) (in lists module)include, exclude, partition (in apply module)

include example

subtype_of(Y, X) :- subtype(X, Y).

?- include(subtype_of(person),[item, man, boy, element], L).

L = [man, boy].

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 41 / 86

Page 50: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Functional Prolog Failure as Negation

Outline

2 Functional PrologVariables as GoalsFinding All SolutionsFailure as Negation

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 42 / 86

Page 51: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Functional Prolog Failure as Negation

Failure as Negation

The ‘fail’ operator\+ R Succeed only if R fails

Programunassignable(X, Y) :- \+ subtype_of(X, Y),

Query?- unassignable(boy, bucket).true.?- unassignable(boy, person).false.

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 43 / 86

Page 52: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Prolog as an Interpreter

Outline

1 Introduction to Prolog

2 Functional Prolog

3 Prolog as an Interpreter

4 Prolog for Software Modeling

5 Prolog Libs and Tricks

6 Summary

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 44 / 86

Page 53: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Prolog as an Interpreter Programs as Inputs

Outline

3 Prolog as an InterpreterPrograms as InputsThe Prolog Meta-InterpreterForward ChainingOOPOther Interpreters

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 45 / 86

Page 54: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Prolog as an Interpreter Programs as Inputs

Programs as Inputs

Interpretersubtype(X, Y) :-

extends(X, Y).subtype(X, Y) :-extends(X, Z),subtype(Z, Y).

composite(C, B) :-subtype(C, B),consists(C, B).

Inputextends(man, person).extends(woman, person).extends(boy, man).consists(couple, man).consists(couple, woman).

Queries?- subtype(X, Y).X = man, Y = person

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 46 / 86

Page 55: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Prolog as an Interpreter Programs as Inputs

Programs as Inputs

Interpretersubtype(X, Y) :-

extends(X, Y).subtype(X, Y) :-extends(X, Z),subtype(Z, Y).

composite(C, B) :-subtype(C, B),consists(C, B).

Inputextends(item, elem).extends(bucket, elem).consists(bucket, elem).

Queries?- subtype(X, Y).X = item, Y = elem

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 46 / 86

Page 56: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Prolog as an Interpreter Programs as Inputs

Programs as Inputs

Interpreter:- op(xfx, 300, |>).:- op(xfx, 300, <>).

subtype(X, Y) :-X |> Y.

subtype(X, Y) :-X |> Z, Z <> Y.

composite(C, B) :-subtype(C, B),C <> B.

Inputitem |> elem.bucket |> elem.bucket <> elem.

Queries?- subtype(X, Y).X = item, Y = elem

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 46 / 86

Page 57: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Prolog as an Interpreter The Prolog Meta-Interpreter

Outline

3 Prolog as an InterpreterPrograms as InputsThe Prolog Meta-InterpreterForward ChainingOOPOther Interpreters

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 47 / 86

Page 58: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Prolog as an Interpreter The Prolog Meta-Interpreter

The Prolog Meta-Interpreter

Meta-Interpretermeta((A, B)) :- !, meta(A), meta(B).meta(A) :- system(A), !, A.meta(A) :- (A :- B), meta(B).system(true).

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 48 / 86

Page 59: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Prolog as an Interpreter The Prolog Meta-Interpreter

The Prolog Meta-Interpreter

Meta-Interpretermeta((A, B)) :- !, meta(A), meta(B).meta(A) :- system(A), !, A.meta(A) :- clause(A, B), meta(B).system(true).

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 48 / 86

Page 60: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Prolog as an Interpreter The Prolog Meta-Interpreter

Modifying the Meta-Interpreter

Asking your opinionmeta((A, B)) :- !, meta(A), meta(B).meta(A) :- system(A), !, A.meta(A) :- clause(A, B), meta(B).meta(A) :-\+ clause(A,_), ground(A),print(A), print(’?’),read(yes).

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 49 / 86

Page 61: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Prolog as an Interpreter Forward Chaining

Outline

3 Prolog as an InterpreterPrograms as InputsThe Prolog Meta-InterpreterForward ChainingOOPOther Interpreters

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 50 / 86

Page 62: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Prolog as an Interpreter Forward Chaining

Forward Chaining

Example program using a ’-:’ operatorp -: q.r, s -: p.q -: t.

Example run?- fire(r), fire(s).true?- t.true.

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 51 / 86

Page 63: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Prolog as an Interpreter Forward Chaining

Forward Chaining Interpreter

Fire:- op(1150, xfx, -:).

fire(X) :- clause(X, true), !.fire(X) :-assert(X),(If -: Then),amember(X, If), % member in a commas list\+ (amember(Y, If), \+ clause(Y, true)),fire(Then),fail.

fire(_).

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 52 / 86

Page 64: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Prolog as an Interpreter OOP

Outline

3 Prolog as an InterpreterPrograms as InputsThe Prolog Meta-InterpreterForward ChainingOOPOther Interpreters

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 53 / 86

Page 65: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Prolog as an Interpreter OOP

Prologer’s OOP

Objectsobject(rect(W, H),

[(area(A) :- A is W*H),(show :- print(W * H))]).

object(square(X), []).isa(square(X), rect(X, X)).

Sending messages?- Rec1 = rect(4,5), send(Rec1, area(A)).A = 20

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 54 / 86

Page 66: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Prolog as an Interpreter OOP

Prolog OOP Interpetersend(Obj, Msg) :-

get_methods(Obj, Methods),process(MSg, Methods).

get_methods(Obj, Methods) :-object(Obj, Methods).

get_methods(Obj, Methods) :- % Inheritanceisa(Obj, Super),get_methods(Super, Methods).

process(Msg, [Msg | _]). % Factprocess(Msg, [(Msg :- Body) | _]) :- % Rule

call(Body).process(Msg, [_ | Rest]) :-

process(Msg, Rest).Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 55 / 86

Page 67: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Prolog as an Interpreter Other Interpreters

Outline

3 Prolog as an InterpreterPrograms as InputsThe Prolog Meta-InterpreterForward ChainingOOPOther Interpreters

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 56 / 86

Page 68: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Prolog as an Interpreter Other Interpreters

Other Interpreters

Breadth-firstBest-firstUncertaintyConstraint solving. . .

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 57 / 86

Page 69: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Prolog for Software Modeling

Outline

1 Introduction to Prolog

2 Functional Prolog

3 Prolog as an Interpreter

4 Prolog for Software Modeling

5 Prolog Libs and Tricks

6 Summary

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 58 / 86

Page 70: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Prolog for Software Modeling OPM

Outline

4 Prolog for Software ModelingOPMErlang ASTSynthesizing Code

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 59 / 86

Page 71: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Prolog for Software Modeling OPM

The Object-Process Methodology (OPM)Dov Dori, 2002

Paragraph (OPL)object person

states single, married.object man, woman, couple.object registry, rabbi, ring.process marrying.man, woman extends person.couple consists man, woman.marrying changes personfrom single to married.

marrying consumes ring(1,2).marrying yields couple.

Diagram (OPD)

person

married

single

couple

man

woman

rabbi

marrying

registry

ring

1..2

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 60 / 86

Page 72: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Prolog for Software Modeling OPM

Representing OPM

OPM databaseobject(person).object(man).object(woman).process(marrying).state(person::single).state(person::married).extends(man, person).extends(woman, person).consists(couple, man).consists(couple, woman).consumes(marrying, ring).produces(marrying, couple)....

Querying?- object(X).X = person ;X = man ;X = woman;...

?- extends(X, person).X = man ;X = woman

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 61 / 86

Page 73: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Prolog for Software Modeling OPM

More Queries

Use casesuse_case(Proc) :-

process(Proc),object(User),handles(User, Proc),\+ (process(Top),

consists(Top, Proc)).

Conversion functionsconvert(Proc, From, To) :-

process(Proc),consumes(Proc, From),yields(Proc, To),\+ requires(Proc, _),\+ handles(_, Proc),\+ (consumes(Proc, X),

X \= From),\+ (yields(Proc, Y),

Y \= To).

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 62 / 86

Page 74: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Prolog for Software Modeling Erlang AST

Outline

4 Prolog for Software ModelingOPMErlang ASTSynthesizing Code

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 63 / 86

Page 75: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Prolog for Software Modeling Erlang AST

Erlang ASTs

Erlang-module(pq).p(X) -> X + 1.q(X) -> X + 2.r(A) -> A + 3.

AST tuples{function,4,p,1,

[{clause,4,[{var,4,’X’}],[],[{op,5,’+’,{var,5,’X’},{integer,5,1}}]}]}

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 64 / 86

Page 76: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Prolog for Software Modeling Erlang AST

Erlang ASTs

Erlang-module(pq).p(X) -> X + 1.q(X) -> X + 2.r(A) -> A + 3.

AST functorsfunction(4,’p’,1,

[clause(4,[var(4,’X’)],[],[op(5,’+’,var(5,’X’),integer(5,1))])])

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 64 / 86

Page 77: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Prolog for Software Modeling Synthesizing Code

Outline

4 Prolog for Software ModelingOPMErlang ASTSynthesizing Code

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 65 / 86

Page 78: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Prolog for Software Modeling Synthesizing Code

A Data Flow Model

Paragraphprocess p, q, r, pq, s.object x, y, z, a, b.pq consists p, q.s consists pq, r.p consumes x.q consumes x.p yields y.q yields z.r consumes a.r yields b.

Diagram

s

pq

p

y

q

z

r

b

a x

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 66 / 86

Page 79: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Prolog for Software Modeling Synthesizing Code

Synthesized Sequential Code

Model

s

pq

p

y

q

z

r

b

a x

Source Code-module(pq).p(X) -> X + 1.q(X) -> X + 2.r(A) -> A + 3.

Sequential Code-module(pq1).-record(pq_ret,{y,z}).-record(s_ret,{b,y,z}).% p, q, and rpq(X) ->

Y = p(X),Z = q(X),#pq_ret{y=Y, z=Z}.

s(A, X) ->#pq_ret{y=Y, z=Z} = pq(X),B = r(A),#s_ret{b=B, y=Y, z=Z}.

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 67 / 86

Page 80: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Prolog for Software Modeling Synthesizing Code

Synthesized Parallel Code

-module(pq1).-record(pq_ret,{y,z}).-record(s_ret,{b,y,z}).p(X) -> X + 1.p1(X) ->

Y = p(X),pq ! {y,Y}.

q(X) -> X + 2.q1(X) ->

Z = q(X),pq ! {z,Z}.

r(A) -> A + 3.r1(A) ->

B = r(A),s ! {b,B}.

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 68 / 86

Page 81: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Prolog for Software Modeling Synthesizing Code

Synthesized Parallel Codepq(X) ->

register(q, spawn(fun() -> q1(X) end)),register(p, spawn(fun() -> p1(X) end)),receive {y,Y} -> ok end,receive {z,Z} -> ok end,#pq_ret{y = Y,z = Z}.

pq1(X) ->#pq_ret{y = Y,z = Z} = pq(X),s ! {y,Y}, s ! {z,Z}.

s(A, X) ->register(s, self()),register(r, spawn(fun() -> r1(A) end)),register(pq, spawn(fun() -> pq1(X) end)),receive {y,Y} -> ok end,receive {z,Z} -> ok end,receive {b,B} -> ok end,#s_ret{y = Y,z = Z,b = B}.

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 68 / 86

Page 82: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Prolog for Software Modeling Synthesizing Code

Example Rules

yields_snd0(P, X,op(’!’, atom(P),

tuple([atom(X), V]))) :-var_of(X, V).

yields_snd(From, To, X, S) :-consists(P, From),consists(P, To),yields_snd0(To, X, S).

yields_snd(From, To, X, S) :-consists(P, From),\+ consists(P, To),yields_snd0(P, X, S).

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 69 / 86

Page 83: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Prolog for Software Modeling Synthesizing Code

Workflow

Sequential

module

Extract AST

from code

OPM

model

Term

expansion

Model as

Prolog facts

AST as

Prolog functors

Synthesize

AST of parallel

module

Erlang

pretty-printer

Parallel

module

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 70 / 86

Page 84: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Prolog Libs and Tricks

Outline

1 Introduction to Prolog

2 Functional Prolog

3 Prolog as an Interpreter

4 Prolog for Software Modeling

5 Prolog Libs and Tricks

6 Summary

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 71 / 86

Page 85: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Prolog Libs and Tricks DCG

Outline

5 Prolog Libs and TricksDCGConstraintsMeta-Prolog

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 72 / 86

Page 86: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Prolog Libs and Tricks DCG

Definitive Clause Grammar (DCG)

Grammar Rulesinteger(I) -->digit(D0),digits(D),{ number_chars(I, [D0|D]) }.

digits([D|T]) -->digit(D), !,digits(T).

digits([]) --> [].

digit(D) -->[ D ],{ code_type(D, digit) }.

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 73 / 86

Page 87: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Prolog Libs and Tricks DCG

Definitive Clause Grammar (DCG)

Grammar Rulesinteger(I) -->digit(D0),digits(D),{ number_chars(I, [D0|D]) }.

digits([D|T]) -->digit(D), !,digits(T).

digits([]) --> [].

digit(D) -->[ D ],{ code_type(D, digit) }.

Call grammar rules

Match in list

Regular Prolog

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 73 / 86

Page 88: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Prolog Libs and Tricks DCG

Definitive Clause Grammar (DCG)

Phrasing?- phrase(integer(X), "42 times", Rest).X = 42Rest = " times"

?- phrase(integer(42), S).S = "42"

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 74 / 86

Page 89: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Prolog Libs and Tricks Constraints

Outline

5 Prolog Libs and TricksDCGConstraintsMeta-Prolog

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 75 / 86

Page 90: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Prolog Libs and Tricks Constraints

Constraints Solving over Finite Domains

ProblemS E N D

+ M O R E---------M O N E Y

Solver:- use_module(library(clpfd)).

puzzle([S,E,N,D] + [M,O,R,E] =[M,O,N,E,Y]) :-

Vars = [S,E,N,D,M,O,R,Y],Vars ins 0..9,all_different(Vars),S*1000 + E*100 + N*10 + D +M*1000 + O*100 + R*10 + E #=M*10000 + O*1000 + N*100 + E*10 + Y,M #\= 0, S #\= 0.

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 76 / 86

Page 91: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Prolog Libs and Tricks Constraints

Variables Labeling

Solving the puzzle?- puzzle(As+Bs=Cs), label(As).As = [9, 5, 6, 7],Bs = [1, 0, 8, 5],Cs = [1, 0, 6, 5, 2]

Labeling optionsMinimum / maximum of an expressionBy orderOther strategies

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 77 / 86

Page 92: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Prolog Libs and Tricks Meta-Prolog

Outline

5 Prolog Libs and TricksDCGConstraintsMeta-Prolog

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 78 / 86

Page 93: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Prolog Libs and Tricks Meta-Prolog

Reflective Predicates

Caller/Callee relations

uses(Caller, Callee) :-current_predicate(Caller, Head),\+ predicate_property(Head, built_in),clause(Head, Body),amember(Goal, Body),\+ var(Goal),functor(Goal, Callee, _).

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 79 / 86

Page 94: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Prolog Libs and Tricks Meta-Prolog

Reflective Predicates

Sample Programbar(X) :- foo(X).bar(X) :- goo(1), bar(X).

Usage?- uses(bar, X).X = foo ;X = goo ;X = bar

?- uses(X, foo).X = bar

?- recursive(X).X = bar

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 80 / 86

Page 95: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Prolog Libs and Tricks Meta-Prolog

Manipulative Predicates

Poor man’s AOPwrap(Head, Before, After) :-

clause(Head, Body),retract((Head :- Body)),Head =.. [Name | Args],atom_concat(Name, 1, Name1),Head1 =.. [Name1 | Args],assert((Head1 :- Body)),assert((Head :- Before, Head1, After)),fail.

wrap(_, _, _).

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 81 / 86

Page 96: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Prolog Libs and Tricks Meta-Prolog

Manipulative Predicates

Predicate:- dynamic test/1.test(A) :- atom(A), !, print(A).test(X) :- N is X + 1, print(N).

Wrapping?- test(5).6?- wrap(test(X), print(X), print(a)).?- test(5).56a

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 82 / 86

Page 97: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Summary

Outline

1 Introduction to Prolog

2 Functional Prolog

3 Prolog as an Interpreter

4 Prolog for Software Modeling

5 Prolog Libs and Tricks

6 Summary

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 83 / 86

Page 98: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Summary

Claimer

Prolog can:Help you write DSLs and interpretersAdd AI capabilities to your domainBe a hacker’s delight!

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 84 / 86

Page 99: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Summary

Bibliography

Leon Sterling, Ehud ShapiroThe Art of Prolog

Richard O’KeefeThe Craft of Prolog

Yoav ShohamArtificial Intelligence Techniques in Prolog

Ivan BratkoProlog Programming for Artificial Intelligence

Dov DoriObject-Process Methodology

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 85 / 86

Page 100: Prolog as a Meta-Languagegwiener/wp-content/... · PrologasaMeta-Language GuyWiener Sayeret Lambda July14,2010 GuyWiener (SayeretLambda) PrologasaMeta-Language July14,2010 1/86

Summary

thank :- you, !.

Guy Wiener (Sayeret Lambda) Prolog as a Meta-Language July 14, 2010 86 / 86