Programming Paradigms CSI2120: Jochen Lang EECS, University of Ottawa Canada
Programming Paradigms CSI2120: Jochen Lang EECS, University of Ottawa Canada
Paradigms
CSI2120
Jochen Lang
EECS, University of Ottawa
Canada
Logic Programming in Prolog
• Advanced Examples
– Collecting solutions of a Goal
– River crossing puzzle
• Database • Queries
bag(2,4,1). ?- bagof(Z,bag(X,Y,Z),B).
bag(3,5,2). ?- bagof(Z,(bag(X,Y,Z),Z>2),B).
bag(7,8,2). • Not binding a variable in a goal with the
bag(4,3,1). existential operator ^
bag(5,2,4). ?- bagof(Z,X^bag(X,Y,Z),B).
bag(2,1,4). ?- setof(Z,X^bag(X,Y,Z),B).
bag(2,2,4). ?- bagof(Z,X^Y^bag(X,Y,Z),B).
bag(7,3,5). • Not binding any variable in the goal (same
bag(7,3,3). as one line above).
?- findall(Z,bag(X,Y,Z),B).
• Database: • Queries:
turn(elgin,wellington). ?- setof(X,turn(X,Y),B).
turn(elgin,catherine). ?- setof(Y,turn(X,Y),B).
turn(elgin,laurier). ?- setof(Y,X^turn(X,Y),B).
turn(qed,laurier). ?- bagof(Y,X^turn(X,Y),B).
turn(qed,bank). ?- setof([X,Y],turn(X,Y),B).
turn(bank,qed).
turn(bank,sommerset).
turn(bank,gladstone).
turn(bank,wellington).
• Database
grade(nick,8).
grade(rachel,4).
grade(peter,3).
grade(monica,7).
grade(samantha,4).
• Queries:
?- setof(A,N^grade(N,A),B).
?- setof(A,N^grade(N,A),[H|T]).
?- setof(A,N^grade(N,A),[H|_]).
?- setof([A,N],grade(N,A),[[_,J]|_]).
?- grade(P,A1),\+((grade(_,A2),A2<A1)).
• Forbidden states (i.e., states where the fox eats the chicken or
the chicken the bag of grains).
– e.g., fox and chicken on left side and farmer on right side or the
other way round
forbidden(state([right, left, left, _])).
forbidden(state([left, right, right, _])).
– Can be combined to:
forbidden(state([X, Y, Y, _])) :- X \== Y.
– And similarly (chicken and bag of grain):
forbidden(state([X, _, Y, Y])) :- X \== Y.
• Top level
puzzle(P) :- initial(StartState),
final(EndState),
crossRiver( StartState, EndState, P).
• Advanced Examples
– Collecting solutions of a Goal
• findall/3
• bagof/3
• setof/3
– River crossing puzzle