1 logic programming. 2 a little bit of prolog objects and relations between objects facts and rules....
TRANSCRIPT
![Page 1: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/1.jpg)
1
Logic Programming
![Page 2: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/2.jpg)
2
A little bit of Prolog• Objects and relations between objects• Facts and rules. Upper case are variables.
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).? parent(X, Y).
We use parent(x,y) to mean x is a parent of y.
But to the computer it is just a relation, which
could mean:
y is a parent of x
x and y are parents of children
“x y” wrote a book on parenting
x and y are related in some way
![Page 3: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/3.jpg)
3
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 if X 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 Z is the parent of both X and Y and X is a femaleTry writing cousinTry writing ancestor
![Page 4: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/4.jpg)
4
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
![Page 5: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/5.jpg)
5
Clause• A clause is either
– a single predicate called a fact
– a rule of the form
condition Þ conclusion
• Conclusion is a single predicate
• Condition is a conjunction of predicates
a1 Ù a2 Ù a3 … Ù an
• Note: prolog write it backwards
• grandparent (X,Y) :- parent(X, Z), parent(Z, Y).
parent(X,Z) Ù parent(Z,Y) Þ grandparent(X,Y)
![Page 6: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/6.jpg)
6
Horn Clauses
• Horn 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)
![Page 7: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/7.jpg)
7
Horn Clauses
grandparent(X,Y) Ü parent(X,Z) Ù parent(Z,Y)
grandparent(X,Y) :- parent(X,Z),parent(Z,Y)
Equivalent to"x : "y : $z parent(X,Z) Ù parent(Z,Y) Þ
grandparent(X,Y)
![Page 8: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/8.jpg)
8
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 understanding
![Page 9: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/9.jpg)
9
Examplemy_last(X,[X]).my_last(X,[_|L]) :-
my_last(X,L).
trace.my_last(X,[1,2,3,4,5]).
Yes[trace] 1 ?- my_last(X,[1,2,3,4,5]). Call: (7) my_last(_G516, [1, 2, 3, 4, 5])
? creep Call: (8) my_last(_G516, [2, 3, 4, 5]) ?
creep Call: (9) my_last(_G516, [3, 4, 5]) ?
creep Call: (10) my_last(_G516, [4, 5]) ?
creep Call: (11) my_last(_G516, [5]) ? creep Exit: (11) my_last(5, [5]) ? creep Exit: (10) my_last(5, [4, 5]) ? creep Exit: (9) my_last(5, [3, 4, 5]) ? creep Exit: (8) my_last(5, [2, 3, 4, 5]) ?
creep Exit: (7) my_last(5, [1, 2, 3, 4, 5]) ?
creep
![Page 10: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/10.jpg)
10
Example
f(a).f(b). g(a).g(b). h(b). k(X) :- f(X),g(X),h(X).
2 ?- trace.
What will happen?
![Page 11: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/11.jpg)
11
Example
f(a).f(b). g(a).g(b). h(b). k(X) :- f(X),g(X),h(X).
2 ?- trace.
[trace] 2 ?- k(X). Call: (8) k(_G396) ? creep Call: (9) f(_G396) ? creep Exit: (9) f(a) ? creep Call: (9) g(a) ? creep Exit: (9) g(a) ? creep Call: (9) h(a) ? creep Fail: (9) h(a) ? creep Redo: (9) f(_G396) ? creep Exit: (9) f(b) ? creep Call: (9) g(b) ? creep Exit: (9) g(b) ? creep Call: (9) h(b) ? creep Exit: (9) h(b) ? creep Exit: (8) k(b) ? creep
X = b
![Page 12: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/12.jpg)
12
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 Z
predecessor(X,Z) :- parent(X,Y), parent(Y,Z)
And so on…
predecessor(X,Z) :- parent(X,Y), predecessor(Y,Z).
![Page 13: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/13.jpg)
13
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 queries.
![Page 14: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/14.jpg)
14
A prolog program comprises clauses - facts, rules and queries
PROGRAMbig(bear). %fact1big(elephant). %fact 2small(cat). %fact 3
• brown(bear). % fact 4• black(cat). % fact 5• grey(elephant). %c fact 6
dark(Z) :- black(Z). %rule7dark(Z) :- brown(Z). %rule 8
?dark(X), big(X). Query (from the prompt)
![Page 15: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/15.jpg)
15
Data ObjectsAtoms versus numbers
versus Variables• Atoms
– strings of letters, digits, and the underscore character 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
![Page 16: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/16.jpg)
16
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 underscore
hasachild(X) :- parent(X,Y)
hasachild(X) :- parent(X,_) Wants singletons to be _
? parent(X, _)
![Page 17: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/17.jpg)
17
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)
![Page 18: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/18.jpg)
18
data objects
simple objects structures
constants variables
atoms numbers
These are all terms
![Page 19: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/19.jpg)
19
Operations on listsMembership
• The member relation member(X,L)
? member(d, [a, b, h, d]).
?
? member(d, [a,b,[d h], e]).
?
?member([d, h], [a, [d,h], e f]).
?
Try writing member
![Page 20: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/20.jpg)
20
Membership
• X 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]).
member(X, [Head | Tail]) :- member(X,Tail).
Note two separate clauses
![Page 21: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/21.jpg)
21
More Involved Membership
• X is a member of L if – X is the head of L, or– X is a member of the tail of L, or– X is a member of a sublist of L
member(X,[X|Tail]).
member(X,[_|Tail]) :- member(X,Tail).
member(X,[L|Tail]) :- member(X,L).
![Page 22: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/22.jpg)
22
At seatsWrite the append function
append([2,3,4], [1,4], [2,3,4,1,4]).
![Page 23: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/23.jpg)
23
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
• Unification– X = Y– X \= Y
• Not identical• X\==Y
![Page 24: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/24.jpg)
24
AppendNotice there is no concept of
input/outputappend([],X,X).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]).
Y = [4, 5]
![Page 25: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/25.jpg)
25
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
![Page 26: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/26.jpg)
26
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.
![Page 27: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/27.jpg)
27
merge([], List, List).merge(List, [], List).merge([H1|T1], [H2|T2], [H1|T3]) :- H1 =< H2, merge(T1, [H2|T2], T3).merge(List1, [H2|T2], [H2|T3]) :- merge(List1, T2, T3).
![Page 28: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/28.jpg)
28
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, 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]
![Page 29: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/29.jpg)
29
Better asmerge([], List, List) :- !.merge(List, [], List):- !.merge([H1|T1], [H2|T2], [H1|T3]) :- H1 =< H2, !, merge(T1, [H2|T2], T3).merge(List1, [H2|T2], [H2|T3]) :- merge(List1, T2, T3).
![Page 30: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/30.jpg)
30
Structures
date(X,Y,Z).date(20, 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)
![Page 31: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/31.jpg)
31
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, 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?
![Page 32: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/32.jpg)
32
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, _), _, _).
![Page 33: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/33.jpg)
33
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
![Page 34: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/34.jpg)
34
Unification
• Matching clauses with variables• Have to find the appropriate substitutions for
variables so that the clauses match• Process is called unification
– Process by which variables are instantiated
![Page 35: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/35.jpg)
35
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)No
?f(a,Y) = f(a,B).Y=_G279B-_G279
![Page 36: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/36.jpg)
36
Unification in Prolog
• A structured term (predicate or function applied to arguments requires – Same predicate/function name– 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? f(a, g(X)) = f(Y, g(b)) = Y=a, X = b
![Page 37: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/37.jpg)
37
Unification examples• Unify the following :
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))
![Page 38: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/38.jpg)
38
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 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
Marcus=Caesar= Yg(X, X) =g(f(X), f(X)) X=f(X) a problem as is
recursive
![Page 39: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/39.jpg)
39
Adding and deleting• How do you add an item to a list?
• Deleting an item from a list – del(X, L, Result)
1. 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 L
3. If you try to delete X from an empty list, return an empty list.
• Try to write the delete function at your seats
• del(4,[2,3,5,4,3,6], [2,3,5,3,6]).
![Page 40: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/40.jpg)
40
Deleting…del(X,[],[]). % unless we wanted it to fail if no X
del(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
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 41: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/41.jpg)
41
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 arguments• if there is such a relation predefined, you hide
the predefined relation.
![Page 42: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/42.jpg)
42
Remove the K'th element from a list.
Example:?- remove_at(2,[a,b,c,d],X,R).X = bR = [a,c,d]
![Page 43: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/43.jpg)
43
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).
![Page 44: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/44.jpg)
44
• 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
? evenlength([a,b,c,d])? yesCan use f ([X,Y|R]) to look at first two items by name.
?oddlength([c, d, e])?yes{
At seats
![Page 45: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/45.jpg)
45
Answers
evenlength(L) :- length(L,Ct), 0 is Ct mod 2. orevenlength([]).evenlength([X,Y|R]) :- evenlength(R).
![Page 46: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/46.jpg)
46
Reading Code: What do the following do?
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).
![Page 47: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/47.jpg)
47
Reading Codequest3([]).quest3([_]).quest3([H1,H2|Rest]) :- H1 =< H2, quest3([H2|Rest]).
quest4(Item, [], [Item]) :- !.quest4(Item, [H|T], [Item,H|
T]):- Item =< H, !.quest4(Item, [H|T], [H|T1]) :-
quest4 (Item, T, T1).
![Page 48: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/48.jpg)
48
Sieve of Eratosthenes primes( Limit, Ps ) :- integers( 2, Limit, Is ), sift( Is, Ps ).
integers( Low, High, [Low|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,[I|Is],Nis) :- 0 is I mod P,!, remove(P, Is, Nis).remove(P,[I|Is],[I|Nis]) :- remove(P, Is, Nis).
![Page 49: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/49.jpg)
49
Translationtranslate( [], [] ).translate( [H|T], [X|Y] ) :- change( H, X ), translate( T, Y ).
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).
![Page 50: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/50.jpg)
50
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, 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].
![Page 51: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/51.jpg)
51
Try this problem 1Write the code to give a specific fibonacci
number: (1,1,2,3,5,8,13…) fib(6,X). x = 8
![Page 52: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/52.jpg)
52
Try these ProblemsWrite the code to give a specific fibonacci
number: (1,1,2,3,5,8,13…) 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 + Z.
![Page 53: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/53.jpg)
53
Try this problem 2Write the code to reverse a list
reverse([3,4,5],X).X = [5,4,3]
![Page 54: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/54.jpg)
54
Try this problem 2Write the code to reverse a list
reverse([3,4,5],X).X = [5,4,3]
reverse([X], [X]).reverse([H|T], R):-
reverse(T, X), append(X, [H], R).
![Page 55: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/55.jpg)
55
Try this problem 3
Write the code to compute factorial:
factorial(5,X).X=120
![Page 56: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/56.jpg)
56
Try this problem 3
Write the code to compute factorial:
factorial(5,X).X=120
factorial(0,1).factorial(N,F) :- N1 is N-1, factorial(N1,F1), F is N*F1.
![Page 57: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/57.jpg)
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]
![Page 58: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/58.jpg)
58
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).
![Page 59: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/59.jpg)
59
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]
![Page 60: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/60.jpg)
60
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).
![Page 61: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/61.jpg)
61
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]
![Page 62: 1 Logic Programming. 2 A little bit of Prolog Objects and relations between objects Facts and rules. Upper case are variables. parent(pam, bob).parent(tom,bob)](https://reader030.vdocument.in/reader030/viewer/2022032516/56649c7e5503460f9493380f/html5/thumbnails/62.jpg)
62
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]
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).
Or could just append and then remove duplicates.