Logic Programming A little bit of Prolog
-
Upload
truongkhanh -
Category
Documents
-
view
235 -
download
1
Transcript of Logic Programming A little bit of Prolog
![Page 1: Logic Programming A little bit of Prolog](https://reader034.fdocuments.in/reader034/viewer/2022042600/5868f44a1a28ab7f7d8b990a/html5/thumbnails/1.jpg)
1
Logic Programming
1
A little bit of PrologObjects and relations between objectsFacts and rules. Upper case are variables.
parent(pam bob) parent(tom bob)parent(pam, bob). parent(tom,bob).parent(tom, liz). parent(bob, ann).parent(bob, pat). parent(pat, jim).
? parent(bob, pat).? parent(bob, liz).? parent(bob, ben).? parent(bob X)
We use parent(We use parent(x,yx,y) to mean x is a parent of y.) to mean x is a parent of y.But to the computer it is just a relation, which But to the computer it is just a relation, which could mean:could mean:
y is a parent of xy is a parent of x
2
? parent(bob, X).? parent(X, Y).
y py px and y are parents of childrenx and y are parents of children“x y” wrote a book on parenting“x y” wrote a book on parentingx and y are related in some wayx and y are related in some way
![Page 2: Logic Programming A little bit of Prolog](https://reader034.fdocuments.in/reader034/viewer/2022042600/5868f44a1a28ab7f7d8b990a/html5/thumbnails/2.jpg)
2
Prologgrandparent (X,Y) :- parent(X, Z), parent(Z, Y).
For all X and Y Upper case means a variable X is the grandparent of Y ifX is the grandparent of Y ifX is a parent of Z and
Z is a parent of Y
sister (X,Y) :- parent(Z, X), parent(Z, Y), female(X).For all X and Y
X is the sister of Y if
3
X is the sister of Y ifZ is the parent of both X and Y and
X is a femaleTry writing cousinTry writing ancestor
Horn Clausesu :- p, q, …, t.can be written as (pΛqΛ … Λt) u
Written as a Horn clause: !p V !q ! … !t V uEither u is true or one of the
4
![Page 3: Logic Programming A little bit of Prolog](https://reader034.fdocuments.in/reader034/viewer/2022042600/5868f44a1a28ab7f7d8b990a/html5/thumbnails/3.jpg)
3
ClauseA clause is either A clause is either
–– a a single predicate called a factsingle predicate called a fact
–– a a rule of the formrule of the form
condition condition conclusionconclusion
Conclusion is a single predicateConclusion is a single predicate
Condition is a conjunction of predicatesCondition is a conjunction of predicates
aa11 aa22 aa3 3 … … aann
5
Note: prolog write it backwards Note: prolog write it backwards
grandparent (X,Y) :- parent(X, Z), parent(Z, Y).
parent(X,Z) parent(X,Z) parent(Z,Y)parent(Z,Y) grandparent(X,Y)grandparent(X,Y)
Horn ClausesHorn clauses don’t have any quantifiers
Assumes that the variables in the head are universally quantified and the variables in the body are existentially quantified (if they don’t appear in the head)appear in the head)
6
![Page 4: Logic Programming A little bit of Prolog](https://reader034.fdocuments.in/reader034/viewer/2022042600/5868f44a1a28ab7f7d8b990a/html5/thumbnails/4.jpg)
4
Horn Clauses
grandparent(X,Y)grandparent(X,Y) parent(X,Z) parent(X,Z) parent(Z,Y)parent(Z,Y)g p ( , )g p ( , ) p ( , )p ( , ) p ( , )p ( , )
grandparent(X,Y)grandparent(X,Y) parent(X,Z),parent(Z,Y)parent(X,Z),parent(Z,Y)
Equivalent toEquivalent to
x : y : z parent(X,Z) z parent(X,Z) parent(Z,Y) parent(Z,Y) grandparent(X,Y)grandparent(X,Y)
7
Trace
It forces Prolog to evaluate queries one step at a time, indicating what it is doing at each step.
Debugging tool – but helps in understandingebugging tool but helps in understanding
8
![Page 5: Logic Programming A little bit of Prolog](https://reader034.fdocuments.in/reader034/viewer/2022042600/5868f44a1a28ab7f7d8b990a/html5/thumbnails/5.jpg)
5
Examplemy_last(X,[X]).my last(X,[ |L]) :-
Yes[trace] 1 ?- my_last(X,[1,2,3,4,5]).
Call: (7) my_last(_G516, [1, 2, 3, 4, 5]) ? my_last(X,[_|L]) :my_last(X,L).
trace.my_last(X,[1,2,3,4,5]).
creepCall: (8) my_last(_G516, [2, 3, 4, 5]) ?
creepCall: (9) my_last(_G516, [3, 4, 5]) ? creepCall: (10) my_last(_G516, [4, 5]) ? creepCall: (11) my_last(_G516, [5]) ? creepExit: (11) my_last(5, [5]) ? creepExit: (10) my_last(5, [4, 5]) ? creepExit: (9) my_last(5, [3, 4, 5]) ? creepE it (8) l t(5 [2 3 4 5]) ? Exit: (8) my_last(5, [2, 3, 4, 5]) ? creepExit: (7) my_last(5, [1, 2, 3, 4, 5]) ? creep
9
Example
f(a).f(b).
g(a).
What will happen?
g(a).g(b).
h(b).
k(X) :- f(X),g(X),h(X).2 ?- trace.
10
![Page 6: Logic Programming A little bit of Prolog](https://reader034.fdocuments.in/reader034/viewer/2022042600/5868f44a1a28ab7f7d8b990a/html5/thumbnails/6.jpg)
6
Example
f(a).f(b).
g(a).
[trace] 2 ?- k(X).Call: (8) k(_G396) ? creepCall: (9) f(_G396) ? creepExit: (9) f(a) ? creepCall: (9) g(a) ? creepExit: (9) g(a) ? creepCall: (9) h(a) ? creepg(a).
g(b).
h(b).
k(X) :- f(X),g(X),h(X).2 ?- trace.
( ) ( ) pFail: (9) h(a) ? creepRedo: (9) f(_G396) ? creepExit: (9) f(b) ? creepCall: (9) g(b) ? creepExit: (9) g(b) ? creepCall: (9) h(b) ? creepExit: (9) h(b) ? creep( ) ( ) pExit: (8) k(b) ? creep
X = b
11
Some more prolog
Recursive rules
example predecessor relation
predecessor(X,Z) :- parent(X,Z).
X is a predecessor of Z if X is a parent of Zpredecessor(X,Z) :- parent(X,Y), parent(Y,Z)
And so on…
predecessor(X Z) : parent(X Y) predecessor(Y Z)
12
predecessor(X,Z) :- parent(X,Y), predecessor(Y,Z).
![Page 7: Logic Programming A little bit of Prolog](https://reader034.fdocuments.in/reader034/viewer/2022042600/5868f44a1a28ab7f7d8b990a/html5/thumbnails/7.jpg)
7
Questions1. How do we get an “or” in Prolog?2. When a variable is instantiated to a value (temporarily bound), we
call that ____________?3. Describe (using technical terms) the procedure Prolog uses to
answer queriesanswer queries.
13
A prolog program comprises clauses - facts, rules and queries
PROGRAMbig(bear). %fact1big(elephant). %fact 2small(cat). %fact 3
brown(bear). % fact 4black(cat). % fact 5grey(elephant). %c fact 6
dark(Z) :- black(Z). %rule7
14
dark(Z) :- brown(Z). %rule 8
?dark(X), big(X). Query (from the prompt)
![Page 8: Logic Programming A little bit of Prolog](https://reader034.fdocuments.in/reader034/viewer/2022042600/5868f44a1a28ab7f7d8b990a/html5/thumbnails/8.jpg)
8
Data ObjectsAtoms versus numbers
versus VariablesAtoms
– strings of letters, digits, and the underscore character beginning with a lower case lettercharacter beginning with a lower case letter
– some strings of special characters– can enclose strings of characters in single
quotes e.g. ‘Fred’Numbers
– integers and floats
15
Data ObjectsAtoms versus Variables
Variables are strings of characters, digits and underscores that begin with an uppercase letter or an underscore
Can use the anonymous underscoreCan use the anonymous underscore
hasachild(X) :- parent(X,Y)
hasachild(X) :- parent(X,_) Wants singletons to be _
16
? parent(X, _)
![Page 9: Logic Programming A little bit of Prolog](https://reader034.fdocuments.in/reader034/viewer/2022042600/5868f44a1a28ab7f7d8b990a/html5/thumbnails/9.jpg)
9
Data ObjectsStructured objects
objects that have several components
location(X, Y, Orientation).location(156, 786, 25).location(156, 786, Orientation).
location is the functor (function object –maintains state between calls in backtracking)
17
data objects
simple objects structures
constants variables
18
atoms numbers
These are all terms
![Page 10: Logic Programming A little bit of Prolog](https://reader034.fdocuments.in/reader034/viewer/2022042600/5868f44a1a28ab7f7d8b990a/html5/thumbnails/10.jpg)
10
Operations on listsMembership
The member relation member(X,L)
? member(d [a b h d]) Try writing memberTry writing member? member(d, [a, b, h, d]).?
? member(d, [a,b,[d h], e]).?
?member([d, h], [a, [d,h], e f]).
y gy g
19
([ , ], [ , [ , ], ])?
MembershipX is a member of L if
– X is the head of L, or– X is a member of the tail of L.
member(X, [X|Tail]).
20
member(X, [Head | Tail]) :- member(X,Tail).
Note two separate clauses
![Page 11: Logic Programming A little bit of Prolog](https://reader034.fdocuments.in/reader034/viewer/2022042600/5868f44a1a28ab7f7d8b990a/html5/thumbnails/11.jpg)
11
More Involved MembershipX is a member of L if
– X is the head of L, or– X is a member of the tail of L, or
X i b f bli t f L– X is a member of a sublist of L
member(X,[X|Tail]).
21
member(X,[_|Tail]) :- member(X,Tail).member(X,[L|Tail]) :- member(X,L).
At seatsWrite the append function
append([2,3,4], [1,4], [2,3,4,1,4]).
22
![Page 12: Logic Programming A little bit of Prolog](https://reader034.fdocuments.in/reader034/viewer/2022042600/5868f44a1a28ab7f7d8b990a/html5/thumbnails/12.jpg)
12
More bits and pieces
Comparison operators (testing, just succeeds or fails, unlike unification where changes occur to instantiation)
– X > Y– X < Y– X >= Y– X =< Y % unexpected order– X =:= Y True if equal 1 + 2 =:= 2 + 1– X =\= Y True if values are not equal
U ifi ti
23
Unification
– X = Y– X \= Y
Not identicalX\==Y
AppendNotice there is no concept of input/output
append([],X,X).append([X|Y],R,[X|T]) :- append(Y,R,T).append([X|Y],R,[X|T]) : append(Y,R,T).
append2([],L,L).append2([X|Xs],Y,R) :-
append2(Xs,Y,R1),R = [X|R1]
?append([1 2 3] Y [1 2 3 4 5])?append([1,2,3], Y, [1,2,3,4,5]).
Y = [4, 5]
24
![Page 13: Logic Programming A little bit of Prolog](https://reader034.fdocuments.in/reader034/viewer/2022042600/5868f44a1a28ab7f7d8b990a/html5/thumbnails/13.jpg)
13
1 ?- append(X,Y,[1,2,3,4,5]).X = []Y = [1, 2, 3, 4, 5] ;
X = [1]Y = [2, 3, 4, 5] ;
X = [1, 2]Y = [3, 4, 5] ;
X = [1, 2, 3]Y = [4, 5] ;
X = [1, 2, 3, 4][ , , , ]Y = [5]
X = [1, 2, 3, 4, 5]Y = [] ;No
25
Cut !Automatic backtracking is one of the most characteristic
features of Prolog. But backtracking can lead to inefficiency.
If Prolog finds a cut in a rule, it will not backtrack on the choices it has made. If it has chosen q for the variable X and encounters a cut, Prolog will consider q the only option for X, even if there are other possibilities in the database.
26
![Page 14: Logic Programming A little bit of Prolog](https://reader034.fdocuments.in/reader034/viewer/2022042600/5868f44a1a28ab7f7d8b990a/html5/thumbnails/14.jpg)
14
merge([], List, List).merge(List, [], List).merge([H1|T1], [H2|T2], [H1|T3]) :-merge([H1|T1], [H2|T2], [H1|T3]) :
H1 =< H2, merge(T1, [H2|T2], T3).
merge(List1, [H2|T2], [H2|T3]) :-merge(List1, T2, T3).
27
Why does this happenmerge([1,3,4,5,7], [2,6],X).X = [1, 2, 3, 4, 5, 6, 7] ;X = [1, 2, 3, 4, 6, 5, 7] ;X [1, 2, 3, 4, 6, 5, 7] ;X = [1, 2, 3, 6, 4, 5, 7] ;X = [1, 2, 6, 3, 4, 5, 7] ;X = [2, 1, 3, 4, 5, 6, 7] ;X = [2, 1, 3, 4, 6, 5, 7] ;X = [2, 1, 3, 6, 4, 5, 7] ;X = [2, 1, 6, 3, 4, 5, 7]
28
![Page 15: Logic Programming A little bit of Prolog](https://reader034.fdocuments.in/reader034/viewer/2022042600/5868f44a1a28ab7f7d8b990a/html5/thumbnails/15.jpg)
15
Better asmerge([], List, List) :- !.merge(List, [], List):- !.merge([H1|T1], [H2|T2], [H1|T3]) :-merge([H1|T1], [H2|T2], [H1|T3]) :
H1 =< H2, !,merge(T1, [H2|T2], T3).
merge(List1, [H2|T2], [H2|T3]) :-merge(List1, T2, T3).
29
Structures
date(X,Y,Z).date(20, june, 2005).
date(Day, june, 2005).date(Day, june, 2005).
date(Day, Month, Year) :- Day > 0, Day <= 31,…….
classTime(cs4700, 1200,th).classTime(cs6100, 0900,th).classTime(cs1410,0930,mwf)
30
![Page 16: Logic Programming A little bit of Prolog](https://reader034.fdocuments.in/reader034/viewer/2022042600/5868f44a1a28ab7f7d8b990a/html5/thumbnails/16.jpg)
16
ExamplesOr, we could have nested structures.
class(cs4700, time(th, 12:00, 13:15), instructor(allan, vicki), location(bus, 345) ).class(cs1400 time(mwf 8:30 9:20) instructor(duhadway linda) location(main 155))class(cs1400, time(mwf,8:30, 9:20), instructor(duhadway, linda), location(main, 155)).class(cs1400, time(mwf, 10:30, 11:20), instructor(mathias, dean), location(main, 115)).class(cs1400, time(mwf, 11:30, 12:20), instructor(duhadway, linda), location(main, 115)).class(cs1400, time(mwf, 13:30, 13:20), instructor(duhadway, linda), location(main, 155)).class(cs2420, time(mwf, 10:30, 11:20), instructor(smith, john), location(main, 225)).class(cs2420, time(th, 9:30, 11:20), instructor(smith, john), location(geol, 105)).
class(C,T,I,L) – accesses the four pieces of the structure.
How do we find when cs4700 starts?How do we find when cs4700 starts?
31
Examplesclass(cs4700, time(th, 12:00, 13:15), instructor(allan, vicki), location(bus, 345) ).class(cs1400, time(mwf,8:30, 9:20), instructor(duhadway, linda), location(main, 155)).class(cs1400, time(mwf, 10:30, 11:20), instructor(mathias, dean), location(main, 115)).class(cs1400, time(mwf, 11:30, 12:20), instructor(duhadway, linda), location(main, 115)).class(cs1400, time(mwf, 13:30, 13:20), instructor(duhadway, linda), location(main, 155)).class(cs2420, time(mwf, 10:30, 11:20), instructor(smith, john), location(main, 225)).class(cs2420, time(th, 9:30, 11:20), instructor(smith, john), location(geol, 105)).
How do we find when cs4700 starts? Called a selectorstart_time(ClassID,T) :-
class(ClassID, time(_,T, _), _, _).
32
![Page 17: Logic Programming A little bit of Prolog](https://reader034.fdocuments.in/reader034/viewer/2022042600/5868f44a1a28ab7f7d8b990a/html5/thumbnails/17.jpg)
17
ExamplesOne way of generating a list is by asking Prolog to find all the solutions to
a goal using the built-in findall/3. To create a list of all the times in the class database (instead of asking for them one at a time), we could do this:
findall(T,start_time(C,T),Times).
The query findall(Object,Goal,List).produces a list List of all the objects Object that satisfy the goal Goal
33
Unification
Matching clauses with variablesHave to find the appropriate substitutions for Have to find the appropriate substitutions for
variables so that the clauses matchProcess is called unification
– Process by which variables are instantiated
34
![Page 18: Logic Programming A little bit of Prolog](https://reader034.fdocuments.in/reader034/viewer/2022042600/5868f44a1a28ab7f7d8b990a/html5/thumbnails/18.jpg)
18
Unification in Prolog…A variable that is uninstantiated unifies with anything
and becomes instantiated with “anything”= causes two things to be unified
? me = X.X = me
? f(a,X) = f(Y, b).X = bY = a
?f(a X) = f(x Y)
35
?f(a,X) = f(x,Y)No
?f(a,Y) = f(a,B).Y=_G279B-_G279
Unification in PrologA structured term (predicate or function applied to
arguments requires – Same predicate/function name
Same number of arguments– Same number of arguments– Arguments can be unified recursively
? f(X) = g(X) - can’t match? f(X) = f(a,b) - can’t match? f(a, g(X)) = f(Y, b) - can’t match
36
? f(a, g(X)) = f(Y, g(b)) = Y=a, X = b
![Page 19: Logic Programming A little bit of Prolog](https://reader034.fdocuments.in/reader034/viewer/2022042600/5868f44a1a28ab7f7d8b990a/html5/thumbnails/19.jpg)
19
Unification examplesUnify the following :
p(X Y) = p(a Z)p(X,Y) = p(a, Z)p(X,X) = p(a,b)ancestor(X,Y) = ancestor(bill, W)p(X,a,Y) = p(Z,Z,b)p(Marcus, g(X,Y)) = p(X, g(Caesar, Marcus))g(X X) = g(f(X) f(X))
37
g(X, X) = g(f(X), f(X))
Unification examples (answers)Unify the following :
p(X,Y) =p(a, Z) X=a, Y and Z are the samep(X X) = p(a b) Can’t unifyp(X,X) = p(a,b) Can t unifyancestor(X,Y) = ancestor(bill, W) X=bill, Y/W the samep(X,a,Y) = p(Z,Z,b) X and Z are the same, Z=a, so X=a,
Y=bp(Marcus, g(X,Y)) = p(X, g(Caesar, Marcus))
Marcus and X are the same, X = Caesar, so
38
Marcus=Caesar= Yg(X, X) =g(f(X), f(X)) X=f(X) a problem as is recursive
![Page 20: Logic Programming A little bit of Prolog](https://reader034.fdocuments.in/reader034/viewer/2022042600/5868f44a1a28ab7f7d8b990a/html5/thumbnails/20.jpg)
20
Adding and deletingHow do you add an item to a list?
Deleting an item from a list – del(X, L, Result)
1 If X i th h d f L lt i th t il f L1. If X is the head of L – result is the tail of L2. If X is contained in the tail of L then concatenate
the head of L onto the del of X from the tail of L3. If you try to delete X from an empty list, return an
empty list.
39
Try to write the delete function at your seats
del(4,[2,3,5,4,3,6], [2,3,5,3,6]).
Deleting…del(X,[],[]). % unless we wanted it to fail if no Xdel(X, [X|Tail], Tail]).
del(X, [Y|Tail], [Y|Tail2]) :- del(X, Tail, Tail2)
Deletes one occurrence from the list
What happens when:
del(a, [a, b, a, a], X).
What if we changed it to
40
g
delall(X,[],[]).delall(X,[X|Tail],Tail2) :- delall(X,Tail, Tail2).delall(X,[Y|Tail],[Y|Tail2]) :- delall(X,Tail, Tail2),X=\=Y.
(not equal – important if we attempt to use “;” to get more solutions)
![Page 21: Logic Programming A little bit of Prolog](https://reader034.fdocuments.in/reader034/viewer/2022042600/5868f44a1a28ab7f7d8b990a/html5/thumbnails/21.jpg)
21
Relations/Terms/QueriesAn important note
You can define different relations with the same name but with different numbers of arguments
e.g. member/1, member/2, member/3
Wrong number of arguments - you will get an error message
arity: number of argumentsif there is such a relation predefined you hide the
41
if there is such a relation predefined, you hide the predefined relation.
Remove the K'th element from a list.
Example:?- remove_at(2,[a,b,c,d],X,R).X bX = bR = [a,c,d]
42
![Page 22: Logic Programming A little bit of Prolog](https://reader034.fdocuments.in/reader034/viewer/2022042600/5868f44a1a28ab7f7d8b990a/html5/thumbnails/22.jpg)
22
Remove the K'th element from a list (answer)
Example:?- remove_at(2,[a,b,c,d],X,R).X = bR = [a,c,d]
remove_at(1,[H|T],H,T).remove_at(N,[H|T],X,[H|R]) :- N1 is N - 1, remove_at(N1,T,X,R).
43
Define two predicates evenlength(List) and oddlength(List) so that they are true if their argument is a list of even or odd length respectively. For example
At seats At seats
? evenlength([a,b,c,d])? yesCan use f ([X,Y|R]) to look at first two items by name.
44
?oddlength([c, d, e])?yes{
![Page 23: Logic Programming A little bit of Prolog](https://reader034.fdocuments.in/reader034/viewer/2022042600/5868f44a1a28ab7f7d8b990a/html5/thumbnails/23.jpg)
23
Answers
evenlength(L) :-length(L,Ct), 0 is Ct mod 2.
orevenlength([]).evenlength([X,Y|R]) :- evenlength(R).
45
Reading Code: What do the following do?
quest1 ([] 0) quest2(1 [F| ] F)quest1 ([], 0).quest1([_|T], L) :-
quest1(T, L1),L is L1 + 1.
quest2(1,[F|_], F).quest2(N,[F|R],Which) :-
N2 is N-1, quest2(N2,R,Which).
46
![Page 24: Logic Programming A little bit of Prolog](https://reader034.fdocuments.in/reader034/viewer/2022042600/5868f44a1a28ab7f7d8b990a/html5/thumbnails/24.jpg)
24
Reading Codequest3([]).quest3([_]).quest3([H1,H2|Rest]) :-
quest4(Item, [], [Item]) :- !.quest4(Item, [H|T], [Item,H|T]):-
Item =< H, !.quest3([H1,H2|Rest]) :H1 =< H2,quest3([H2|Rest]).
Item H, !.quest4(Item, [H|T], [H|T1]) :-
quest4 (Item, T, T1).
47
Sieve of Eratosthenesprimes( Limit, Ps ) :- integers( 2, Limit, Is ), sift( Is, Ps ).
integers( Low, High, [Low|Rest] ) :-Low =< High ! M is Low+1 integers(M High Rest )Low =< High, !, M is Low+1, integers(M, High, Rest ).
integers( _,_,[] ).
sift( [], [] ).sift( [I|Is], [I|Ps]) :- remove(I,Is,New), sift( New, Ps ).
remove(P [] [])remove(P,[],[]).remove(P,[I|Is],Nis) :- 0 is I mod P,!, remove(P, Is, Nis).remove(P,[I|Is],[I|Nis]) :-
remove(P, Is, Nis).
48
![Page 25: Logic Programming A little bit of Prolog](https://reader034.fdocuments.in/reader034/viewer/2022042600/5868f44a1a28ab7f7d8b990a/html5/thumbnails/25.jpg)
25
Translationtranslate( [], [] ).translate( [H|T], [X|Y] ) :- change( H, X ), translate( T, Y ).
change( you, i ).change( you, i ).change( are, [am, not ] ).change( french, german ).change( do, did).change( X, X ).
What is the output?- alter([you,are,a, french,computer],F).
49
Ask ?- translate([you,are,a, french,computer],F).F = [i, [am, not], a, german, computer] ;F = [i, [am, not], a, french, computer] ;F = [i, are, a, german, computer] ;F [i, are, a, german, computer] ;F = [i, are, a, french, computer] ;F = [you, [am, not], a, german, computer] ;F = [you, [am, not], a, french, computer] ;F = [you, are, a, german, computer] ;F = [you, are, a, french, computer].
50
![Page 26: Logic Programming A little bit of Prolog](https://reader034.fdocuments.in/reader034/viewer/2022042600/5868f44a1a28ab7f7d8b990a/html5/thumbnails/26.jpg)
26
Try this problem 1Write the code to give a specific fibonacci
number:(1,1,2,3,5,8,13…)
fib(6,X).x = 8
51
Try these ProblemsWrite the code to give a specific fibonacci number:
(1,1,2,3,5,8,13…)fib(6 X)fib(6,X).
x = 8
fib(X, Y):-X > 1, X1 is X - 1, X2 is X - 2, fib(X1 Z) fib(X2 W) Y is W + Zfib(X1, Z), fib(X2, W), Y is W + Z.
52
![Page 27: Logic Programming A little bit of Prolog](https://reader034.fdocuments.in/reader034/viewer/2022042600/5868f44a1a28ab7f7d8b990a/html5/thumbnails/27.jpg)
27
Try this problem 2Write the code to reverse a list
reverse([3,4,5],X).X = [5,4,3]
53
Try this problem 2Write the code to reverse a list
reverse([3 4 5] X)reverse([3,4,5],X).X = [5,4,3]
reverse([X], [X]).reverse([H|T], R):-
reverse(T X) append(X [H] R)reverse(T, X), append(X, [H], R).
54
![Page 28: Logic Programming A little bit of Prolog](https://reader034.fdocuments.in/reader034/viewer/2022042600/5868f44a1a28ab7f7d8b990a/html5/thumbnails/28.jpg)
28
Try this problem 3
Write the code to compute factorial:
factorial(5,X).X=120
55
Try this problem 3
Write the code to compute factorial:
factorial(5,X).X=120
factorial(0 1)factorial(0,1).factorial(N,F) :- N1 is N-1,
factorial(N1,F1), F is N*F1.
56
![Page 29: Logic Programming A little bit of Prolog](https://reader034.fdocuments.in/reader034/viewer/2022042600/5868f44a1a28ab7f7d8b990a/html5/thumbnails/29.jpg)
29
Try this problem 4Write the code to remove multiple copies
from a list.
make_set([1,3,5,2,2,4,1,2,6,3],X).X=[5,4,1,2,6,3]
57
Try this problem 4Write the code to remove multiple copies from a
list.
make_set([1,3,5,2,2,4,1,2,6,3],X).X=[5,4,1,2,6,3]
make_set([],[]).make set([X|Y],Y2) :- member(X,Y), !, _ ([ | ], ) ( , ), ,
make_set(Y,Y2).make_set([X|Y],[X|Y2]) :- make_set(Y,Y2).
58
![Page 30: Logic Programming A little bit of Prolog](https://reader034.fdocuments.in/reader034/viewer/2022042600/5868f44a1a28ab7f7d8b990a/html5/thumbnails/30.jpg)
30
Try this problem 5Write the code to perform set difference: remove
any elements of the second list from the first list.
difference([1,3,7,4], [5,3,4,2], X).X=[1,7]
59
Try this problem 5Write the code to remove any elements of the
second list from the first list.
difference([1,3,7,4], [5,3,4,2], X).X=[1,7]
difference([],Y,[]).difference([X|R],Y,Z) :-([ | ], , )
member(X,Y),!,difference(R,Y,Z).difference([X|R],Y,[X|Z]) :- difference(R,Y,Z).
60
![Page 31: Logic Programming A little bit of Prolog](https://reader034.fdocuments.in/reader034/viewer/2022042600/5868f44a1a28ab7f7d8b990a/html5/thumbnails/31.jpg)
31
Try this problem 6Write the code to union two lists, but not include
duplicates from the two lists.
union([1,3,5,6], [1,4,6,8],X).X=[1,3,5,6,4,8]
61
Try this problem 6Write the code to union two lists, but not include duplicates from the
two lists.
i ([1 3 5 6] [1 4 6 8] X)union([1,3,5,6], [1,4,6,8],X).X=[1,3,5,6,4,8]
union([],X,X).union([X|R],Y,Z) :- member(X,Y), !, union(R,Y,Z).union([X|R],Y,[X|Z]) :- union(R,Y,Z).
O ld j t d d th d li tOr could just append and then remove duplicates.
62