6.0 prolog lab using visual prolog version 5.2 example 1: assume the following “likes” facts...

58
6.0 PROLOG LAB Using visual PROLOG version 5.2 Example 1: Assume the following “likes” facts knowledge base likes (ali, football). likes (ali, tennis). likes (ahmad, tennis). likes (ahmad, handball). likes (samir, handball). likes (samir, swimming). likes (khaled, horseriding).

Post on 22-Dec-2015

380 views

Category:

Documents


6 download

TRANSCRIPT

6.0 PROLOG LAB Using visual PROLOG version 5.2

Example 1: Assume the following “likes” facts knowledge baselikes (ali, football).likes (ali, tennis).likes (ahmad, tennis).likes (ahmad, handball).likes (samir, handball).likes (samir, swimming).likes (khaled, horseriding).

defines non-deterministic predicates that can backtrack and generate multiple solutions. Predicates declared with the keyword nondeterm can fail and, in this case, do not produce any solution.

A sequence of characters, implemented as a pointer to an entry in a hashed symbol-table, containing strings. The syntax is the same as for strings.

To represent the likes facts in VPROLOG

• FileNewnoname.pro• Then in the predicate section write the

declaration of the used predicates:PREDICATESnondeterm likes (symbol,symbol)• Then in the clauses section write the facts:CLAUSESlikes (ali,football).likes (ali,tenis).likes (ahmad,tenis).likes (ahmad,handball).likes (samir,handball).likes (samir,swimming).likes (khaled,horseriding).

1 .Queries as goals in PROLOG

• To supply a query in PROLOG put it in the goal section as follows:

GOAL

likes (ali, football).• Then press Cntrl+G

The output will be Yes or No for concrete questions

1. Concrete questions: (queries without variables)

Example:

GOAL

likes(samir, handball). Yes

Likes (samir,football). No

2 .Queries with variables• To know all sports that ali likes:

likes(ali,What).

• To know which person likes teniss

likes (Who,tenis).

• To know who likes what (i.e all likes facts)

likes (Who,What)

3.Compound queries with one variable

1. To list persons who likes tennis and football, the goal will be

likes( Person, tennis ),likes (Person, football).

2. To list games liked by ali and ahmad

likes (ali,Game),likes (ahmad,Game).

Game=tennis

Person=ali

4-Compound queries with multiple variables

• To find persons who like more than one game:

likes(Person, G1),likes (Person,G2),G1<>G2.

• To find games liked by more than one person:

likes (P1,Game),likes(P2,Game),P1<>P2.

5. Facts containing variables• Assume we add the drinks facts to the likes

database as follows:PREDICATESdrinks(symbol, symbol)CLAUSES drinks(ali, pepsi).drinks (samir, lemonada).drinks (ahmad, milk).• To add the fact that all persons drink water:drinks (Everyone, water).• If we put a goal like:drinks (samy,water). drinks (ahmad,water).

The answer will be: yes

6.Rules• Rules are used to infer new facts from

existing ones.

• A rule consists of two parts: head and body separated by the symbol (:-) .

• To represent the rule that express the facts that two persons are friends if they both like the same game:

friends( P1,P2):-

likes (P1,G),likes (P2,G),P1<>P2. The head of the rule

The body of the rule

Rule’s symbol

7.Backtracking in PROLOG• For PROLOG to answer the query :friends (ali, P2).PROLOG will do the following matches and backtracking to

the friends rule:

P1GP2P1<>P2friends (ali,P2)

alifootballalifalsefail

alitennisalifalsefail

alitennisahmadtruesucceed

8.The domains section in VPROLOG

• It is used to define domains other than the built-in ones, also to give suitable meanings to predicate arguments.

• For example to express the likes relation:likes(person, game)

We should first declare person in the domains section as follows:

domainsperson,game= symbol predicateslikes (person, game)

Person and game are unknown domains(error)

This declaration will allow prolog to detect type errors.Example: the query likes(X,Y), likes(Y,Z) will result in a type error, because Y will be matched to a game constant and can not replace a person variable in the second sub goal.

9 .Built-in domainsdomainNumber of bitsrange

short16 bits-32768..32767

ushort16 bits0..65535

long32 bits-2147483648..

2147483648

ulong32 bits0..4294967295

integer16 bit platform-32768..32767

integer32 bit platform-2147483648..

2147483648

byte8 bits0..255

word16 bit0..65535

dword32 bit0.. ..4294967295

10. Basic standard domainsDomaindescription

char8-bits surrounded by single quotation: ‘a’

realFloating point number:

42705, 9999, 86.72, 911.98e237

Range 1e-307..1e+308

stringPointer to 0-terminated byte arraey

telephone, “Telephone”,t2,”T2”

symbolAs strings but implemented as a pointer to hashed symbol tablefaster than strings

11. How to do arithmetic operationsDOMAINSnumber=integerPREDICATESaddnum(number,number,number)multnum(number,number,number)CLAUSESaddnum(X,Y,S):-S=X+Y.multnum(X,Y,P):-P=X*Y.If the goal is:Addnum(5,7,X).OrMultnum(5,7,X).

X=12

X=35

Note:The compound goal:

multnum(7,5,X),addnum(X,X,Answer). Will result in

X=35, Answer=70

12. More programs to test domains

• The isletter(X) predicate gives yes if X is a letter:PREDICATESisletter(char)CLAUSESisletter(Ch):-‘a’<=Ch,Ch<=‘z’.isletter(Ch):-‘A’<=Ch,Ch<=‘Z’.

To test this program, give it the following goals:a- isletter(‘x’). yesb- isletter(‘2’). noc- isletter(“hallo”). type errord- isletter(a). Type errore- isletter(X) free variable message

13. Multiple arity predicates overloading

• The arity of a predicate is the number of arguments that it takes.

• You can have two predicates with the same name but with different arities.

• You must group different arity versions of a given predicate name in both the predicate and clauses sections.

• The different arities predicates are treated as different predicates.

14. Example: for multiple arity predicates

DOMAINSperson=symbolPREDICATES

nondeterm father (person)

nondeterm father (person, person)CLAUSESfather (Man):- father (Man,_).father (ali, ahmad).father (samy, khaled).

Anonymous variable can match anything.

A person is said to be a father if he is a father of any one.

15. A complete expert system that decides how a person can buy a car.• Assuming

– A person is described by the two relations:

salary (person, money)

savings (person, money)– A car for sale is described by the two relations:

cash (cartype, money)

takseet(cartype,money)

• A person can buy a car

-with cash money if one third of his savings is greater or equal to the cash price of the car.

-with takseet if one third of his salary is greater or equal to the price of the car in case of cash divided by 30.

- If the person can buy a car using cash or takseet the system will advice him to buy with cash

The VPROLOG program DOMAINSperson, car =symbolmoney=realway=stringPREDICATESsalary (person, money)savings (person, money)cash (car, money)takseet (car, money)canbuy (person, car,way)howcanbuy (person, car,way)

CLAUSEScash (cressida,15000).cash (camri,55000).cash (caprise82,5000).cash (caprise90,8000).cash (landcruizer2003,100000).takseet (Car, TPrice):-cash (Car, Price), TPrice=Price*1.2.canbuy ( Person, Car, “cash”):-savings (Person, M), cash( Car, N), M/3>=N.canbuy ( Person,Car, “takseet”):-salary (Person, M), takseet(Car,T),M/3>=T/30.

howcanbuy (Person,Car,Way):-

canbuy (Person,Car,Way),Way="cash";

canbuy (Person, Car, Way), Way="takseet", NOT(canbuy (Person,Car,"cash")).

Should be placed around expressions which include only constants and /or bounded variables.

OR

These variables will be bounded before reaching the “not” expression containing them

16 .Controlling Backtracking• The fail Predicate:• V Prolog begins

backtracking when a call fails.

• The fail predicate is used to force backtracking.

• The following program uses fail to get all solutions.

• Without fail we will get only one solution.

DOMAINS

name=symbol

PREDICATES

nondeterm father(name,name)

everybody

CLAUSES

father (ali, salem).

father (ahmad, ibrahim).

father (ahmad, zaynab).

everybody:-

father (X,Y), write (X,” is ” ,Y,”’s father\n” ), fail.

everybody.

GOAL everybody.

To make the goal succeed at the end

• Preventing backtracking by the cut (!)• It is impossible to backtrack across a cut.• Green cut: it is a cut used to prevent

solutions which does not give meaningful solutions.

• Red cut : it is a cut used to prevent alternate subgoals.

• Example: to prevent backtracking to previous subgoals:

r1:- a, b, !, c.r1:-d.

Only first solution to a and b is considered with many solutions for c

this clause for r1 will not be considered if a solution is found in the above rule.

17. Highway Map modelling and recursive rules

• To represent the shown map we use the predicate

link ( node, node, distance)

• To find a path from s to d– get it from mentioned facts :

path (S,D, TDist):-link (S, D, TDist).– Or find a node x which has a link

from S to X and a path from X to D as follows:

path (S,D, TDist):-

link (S,X,DS1),path (X,D,DS2), TDist=DS1+DS2.

a b

c

d

4

2

56

g

link(a,b,4).

link (a,c,2).

link (b,g,5).

link (c ,g,6).

link (c,d,5).

link (d,g,3).

5

3

Total distance

DOMAINSnode=symboldistance= integerPREDICATESnondeterm link (node, node, distance)nondeterm path ( node, node, distance)CLAUSESlink(a,b,4).link (a,c,2).link (b,g,5).link (c ,g,6).link (c,d,5).link (d,g,3).path (S,D, TDist):-link (S, D, TDist).path (S,D, TDist):-

link (S, X, TD1 ),path (X,D,TD2), TDist=TD1+TD2.GOAL path (a, g, TotalDistance).

Recursive rule

The complete path distance finder program

Facts that model the road map

TotalDistance=9TotalDistance=8TotalDistance=103 Solutions

output

18. Rules which behave like procedures

• A rule that when its head is found in a goal will print something.

• Rules used like case statements:

Only rules with matching arguments will be executed, others will be tested but will fail.

greet-:write(“ASalamo Alykom”),n1.

PREDICATESnondeterm action (integer)CLAUSESaction(1):- nl, write (“N=1”),nl.action(2):- nl, write (“N=2”),nl.action(3):- nl, write (“N=3”),nl.action (N):- nl,N<>1,N<>2,N<>3,write (“N=?”),nl.GOALwrite (“Type a number 1->3”), readint (N) , action(N).

• Since rules that has unmatched arguments will be tested and will fail. This will slow the program. To speed up the system use the cut as shown.

• If you want to test a range x>5 and <9 place the cut after the test sub goals.

PREDICATESnondeterm action (integer)CLAUSESaction(1):-!, nl, write (“N=1”),nl.action(2):- !,nl, write (“N=2”),nl.action(3):- !,nl, write (“N=3”),nl.action (_):- nl,,write (“unknown number ?”),nl.GOALwrite (“Type a number 1->3”), readint (N) , action(N).

Action(X):- X>5,X<9,!,write(“5<N<9”),n1.

To make a rule return a value

• To define a rule which classifies a number either positive, negative or zero:

PREDICATESnondeterm classify (integer,symbol).CLAUSESclassify( X,pos):- X>0.classify( X,neg):- X<0.classify( X,zero):- X=0.GoalClassify ( 5,What)Classify (-4,What)Classify (X,What)

What=pos

What=nig

error

What carries the returned

result

What carries the returned

result

19. Compound data objects• Compound data objects allow you to treat

several pieces of information as a single item (like structures in c, c+, or c#).

• Example: to represent a date object:DOMAINSdate_cmp= date(string, unsigned, unsigned)Hence in a rule or goal you can write:..,D=date(“March”,1,1960). Here D will be treated as a single item.

called : functor

• The arguments of a compound object can themselves be compound:

Example : to represent the information for the birthday of a person:-

birthday(person(“ahmad”,”ali”),date(1,”march”,1960)(

BIRTHDAY

PERSON DATE

Ahamd Ali March1 1960

DOMAINSbirthday= birthday (person, date)person = person (name, name)date= date (day, month, year)name, month =stringday, year= unsigned

19.1 A family birthday programDOMAINSperson = person (name, name)birthdate= bdate (day, month, year)name, month =stringday,year= unsignedPREDICATESnondeterm birthday (person, bdate)CLAUSESbirthday(person("amin","mohamad"),bdate(1,"March",1960)).birthday(person("mohamd","amin"),bdate(11,"Jan",1988)).birthday(person("abdo","mohamad"),bdate(11,"Oct",1964)).birthday(person("ali","mohamad"),bdate(1,"Feb",1950)).birthday(person("suzan","antar"),bdate(1,"March",1950)).GOAL%birthday(X,Y).%birthday(X,date(_,"March",_)).%birthday(person(X,"mohamad"),bdate(_,_,Y).(

Compound objects

Lists persons whose second name is “mohamd” with year of birth

Lists all birthday’s person, and date objects

Lists persons born on March

19.2 Using system dateDOMAINS

person = person (name, name)

bdate= bdate (day, month, year)

name=string

day ,month, year= unsigned

PREDICATES

nondeterm birthday (person, bdate)

get_birth_thismonth

testnow (unsigned, bdate)

write_person(person)

CLAUSES

birthday(person("amin","mohamad"),bdate(1,3,1960)).

birthday(person("mohamd","amin"),bdate(11,5,1988)).

birthday(person("abdo","mohamad"),bdate(11,5,1964)).

birthday(person("ali","mohamad"),bdate(1,6,1950)).

birthday(person("suzan","antar"),bdate(1,3,1982)).

get_birth_thismonth:- date (_,Thism ,_), write ( “now month is", Thism), nl, birthday (P, D), testnow(Thism, D), write_person(P), fail.

get_birth_thismonth:-write (“Press any key to continue"), nl, readchar(_).

testnow(TM,bdate (_,BM,_)):- TM=BM.

write_person(person(Fn, Ln)):-write(" ", Fn, "\t\t ", Ln), nl.

GOAL get_birth_thismonth.

19.3 Using alternatives in domain declaration

• Assume we want to declare the following statements:– Ali owns a 3-floar house– Ali owns a 4-door car– Ali owns a 3.2 Ghz computer– To define a thing to be either house, car, or computer:

DOMAINSthing= house( nofloars); car (nodoors); computer(ghertz)nofloars,nodoors=integerghertz=realperson= person(fname, lname)fname, lname=symbolPREDICATESnondeterm owns(person, thing)CLAUSESowns( person(mohamad, ali), house(3)).owns(person(mohamd,ali),computer(3.2)).

Use or(;) to separate alternatives.

goalowns (P,X).2 solutions

19.4 Lists• To declare the subjects

a teacher might teach:PREDICATESteacher (symbol, symbol, symbol)CLAUSESteacher (ahmad, ezz,cs101).teacher (ahmad, ezz, cs332).teacher (amin, mohamad, cs435).teacher (amin,mohamad, cs204).teacher (amin,mohamad, cs212).teacher (reda, salama, cs416).teacher (reda, salama,cs221).

Here, the teacher name is repeated many times.

We need a variable length data structure that holds all subjects that a teacher can teach

DOMAINSsubject=symbol *PREDICATESteacher (symbol,symbol,subject)CLAUSESteacher(ahmad, ezz,[cs101,cs332] )

Solution use a list data structure for the subject

Solution: use a list data structure for the subject

teacher (amin,mohamad, [cs204, cs435, cs212] ).teacher (reda,salama, [cs416, cs221] ).

20 .Repetition and Recursion• Repetition can be expressed in PROLOG

in procedures and data structures.

• Two kinds of repetition exist in PROLOG :

Backtracking: search for multiple solutions Recursion: a procedure calls itself

Normal recursion:

Takes a lot of memory and time

Tail recursion: fast and less memory

Compiled into iterative loops in M/C language

When a sub goal fails, PROLOG returns to the most recent subgoal that has an untried alternative.Using the fail predicate as the end of repeated subgoals we enforce PROLOG to repeat executing different alternatives of some subgoals.

20.1 Repetition using backtracking

PREDICATES

nondeterm country (symbol)

print_countries

CLAUSES

country (“Egypt”).

country (“SaudiArabia”).

country ( “Seria”).

country (“Sudan”).

print_countries:- country(X), write(X), nl, fail.

print_countries.

GOAL

print_countries.

•Example: Using fail to print all countries:

country(X)write (X)

nlfailprint_countries

X=“Egypt”okokfailfail

X=“SaudiArabia”

okokfailfail

X=“Seria”okokfailfail

X=“Sudan”okokfailfail

20.1.2 Pre and post actions

• PREDICATES• nondeterm country (symbol)• nondeterm print_countries• CLAUSES• country ("Egypt").• country ("SaudiArabia").• country ( "Seria").• country ("Sudan").• print_countries:-• write("Some Arabic

countries are"),nl,fail.• print_countries:-

country(X), write(X," and "), fail.

• print_countries:-• nl, write("there are others"),

nl.• GOAL• Print_countries.

•To do pre-actions (before the loop )or post-actions (after the loop), write different versions of the same predicate.

country(X)write(X, ” and “)

failPrint_countries

X=“Egypt”Okfailfail

X=“SaudiArabia”Okfailfail

X=“Seria”Okfailfail

X=“Sudan”Okfailfail

Some Arabic countries areEgypt and SaudiArabia and Seria and SudanThere are others

Pre-action

Post-actionMain-action

20.2 Implementing backtracking with loops• The following repeat

predicate tricks PROLOG and makes it think it has infinite solutions:

repeat.

repeat:- repeat.

The shown program uses repeat to keep accepting a character and printing it until it is CR

Multiple solutions attract backtracking when fail occurs

PREDICATES

repeat

typewriter

CLAUSES

repeat.

repeat:- repeat.

trypewriter:-

repeat,

readchar(C),

write(C) ,

C=‘\r’,! . /* if CR then cut

1st solution

2nd solution

Nth solution

(N+1)th solution

20.3 Recursive procedures• To find the factorial of a

number N : FACT(N)

IF N=1 then FCT(N)=1

Else

FACT(N)=N* FACT(N-1)

• Using PROLOG, the factorial is implemented with two versions of the factorial rule as shown here.

PREDICATES

factorial (unsigned, real)

CLAUSES

factorial (1,1):-!.

factorial (N, FactN):-

M=N-1,

factorial (M, FactM),

FactN=N*FactM.

Goal

factorial (5,F).

F=1201 Solution

20.4 Tail Recursion• Occurs when a procedure calls itself as the last step. • Occurs in PROLOG ,when

1. The call is the very last subgoal in a clause.

2. No backtracking points exist before this call.

3. The recursive predicate does not return a value.

4. Only one version of this predicate exists.

• Example:

count (N):-

write(N), nl,

NewN=N+1,

count (NewN).

GOAL

count(0).

Write numbers from 0 to infinity ( will get unexpected values due to overflow)

(1) Last call no need to save state of the previous call stack is free no extra memory is needed small memory and fast due to no need to push state

No alternative solutions hereNo alternative solutions here

)2 (No alternative solutions exist here no backtracking points

(3)N is bound to a constant value and no other free variable no return value

You can use a cut(!) before the last call to be sure of (2).

20.5 Using arguments as loop variables• To implement

factorial with iterative procedure using C-language:

long fact;long p=1;unsigned i=1;while(i<=n){p=p*i;i=i+1;}fact=p;

PREDICATES

factorial (unsigned, long)

factorial_r(unsigned, long, unsigned, long)

CLAUSES

factorial (N, FactN):-

factorial_r(N, FactN,1,1).

factorial_r( N, FactN, I, P):-

I<=N,

! ,

NewP=P*I,

NewI=I+1,

factorial_r(N,FactN,NewI,NewP).

factorial_r(N, FactN ,I ,P):- I>N, FactN=P.

Initialize arguments I,P

Test end condition to go to other version if not satisfied.

To prevent backtracking and to allow tail recursion.

21 .Lists and Recursion• List processing allows handling objects that

contain an arbitrary number of elements.• A list is an object that contains an arbitrary

number of other objects.• A list that contains the numbers 1,2 and 3 is

written as [1,2,3] .• Each item contained in a list is know as an

element.• To declare the domain of a list of integers:

– Domains– intlist= integer * Means list of integers

Could be any other name ( ilist, il,…)

• The elements of a list must be of a single domain.

• To define a list of mixed types use compound objects as follows:

• Domains– elementlist= element *– element=ie (integer); re ( real); se (string)

• A list consists of two parts:– The head : the first element of the list– The tail : a list of the remaining elements.

• Example: if l=[a,b,c] the head is a and the tail is [b, c].

The HeadtThe Tail

• If you remove the first element from the tail of the list enough times, you get down to the empty list ([ ]).

• The empty list can not be broken into head and tail.

• A list has a tree structure like compound objects.• Example: the tree structure of

[a, b,c, d] is drawn as shown

in the figure.

list

a list

b list

c list

d [ ]

Note : the one element list [a] is not as the element a since [a] is really the compound data structure shown here

[a]

a [ ]

21.1 List processing• Prolog allows you to treat the head and tail

explicitly. You can separate the list head and tail using the vertical bar (|).

• Example :

• [a, b, c ]

≡[a | [b, c ] ]

≡[a | [b| [c ] ] ]

≡[a | [b| [c| [] ] ] ]

≡[a , b| [c ] ]

• 21.2 List unification: the following table gives examples of list unification:

list1list2Variable binding

[X, Y, Z][ book, ball, pen ]X=book, Y=ball, Z=pen

[7][X|Y]X=7,Y=[ ]

[1, 2, 3, 4][X, Y|Z ]X=1,Y=2,Z=[3,4]

[1,2][3|X]fail

• 21.3 Using lists– Since a list is really a

recursive compound data structure, you need recursive algorithms to process it.

– Such an algorithm is usually composed of two clauses:-

• One to deal with empty list.• The other deals with

ordinary list (having head and tail).

• Example: the shown program writes the elements of an integer list.

DOMAINS

list= integer *

PREDICATES

write_a_list( list )

CLAUSES

write_a_list([ ]).

write_a_list ( [ H | T ] ):-

write(H),

nl,

write_a_list( T).

GOAL

write_a_list([ 1, 2, 3]).

Do nothing but report success.

Write the head

Write the Tail list

T=[ ]

• Two logical rules are used to determine the length of a list

1. The length of [ ] is 0.

2. The length of the list [X|T] is 1+the length of T.

• The shown Prolog program counts the number of elements of a list of integers (can be used for any type).

DOMAINS

list= integer *

PREDICATES

length_of ( list, integer)

CLAUSES

length_of ( [], 0).

Length_of ( [ H | T ],L ):-

length_of ( T ,M ),

L=M+1.

GOAL

length_of([ 1, 2, 3],L).

T=[ ]

21.4 Counting list elements

L=3

Homework: modify the length program to calculate the sum of all elements of a list

21.5 Modifying the list• The following

program adds 1 to each element of a list L1 by making another list L2:– If L1 is [ ] then L2=[ ]– If L1=[H1|T1]

assuming L2=[H2|T2] then

• H2=H1+1.• Add 1 to T1 by the

same way

DOMAINSlist= integer *PREDICATESadd1 ( list, list)CLAUSESadd1 ( [], []).

add1 ( [ H1 | T1 ],[H2|T2] ):-H2=H1+1,add1( T1,T2).GOALadd1( [ 1, 2, 3], L ).

L=[ 2, 3, 4]

21.6 Removing Elements from a list• The following

program removes negative elements from a list L1 by making another list L2 that contains non negative numbers of L1 :– If L1 is [ ] then L2=[ ]– If L1=[H1|T1] and

H1<0 then neglect H1 and process T1

– Else make head of L2 H2=H1 and Repeat for T1.

DOMAINSlist= integer *PREDICATESdiscard_NG ( list, list)CLAUSESdiscard_NG ( [], []).

discard_NG ( [ H1 | T1 ],L2 ):-H1<0,!,discard_NG(T1,L2).

discard_NG ( [ H1 | T1 ],[H1|T2] ):-discard_NG(T1,T2).GOALdiscard_NG( [ 1, -2, 3], L ).

L=[ 1, 3]

21.7 List Membership

• To detect that an element E is in a list L:– If L=[H|T] and E=H

then report success

Else– search for E in T

DOMAINS

namelist= name*

name= symbol

PREDICATES

nondeterm member (name, namelist)

CLAUSES

member (E ,[E | _ ] ).

member (E, [ _ | T]):-

member (E,T).

GOAL

member (ali, [samy, salem,ali]).

Yes

Try the goalmember (X, [samy, salem,ali]).What happens if we put a cut at the first clause as follows:member (E ,[E | _ ] ):- ! .

21.8 Appending one list to another

• To append L1 to L2 we get the result in L3 as follows

• Append (L1,L2,L3):– If L1=[ ] then L3=L2.– Else– Make H3=H1

and– make T3 =T1 +L2

DOMAINS

intlist= integer*

PREDICATES

append (intlist, intlist, intlist)

CLAUSES

append ([], L2,L2 ).

append ([H | T1], L2,[H|T3] ):-

append (T1, L2, T3).

GOAL

append([1,2,3],[5,6],L).

L= [1,2,3,5,6].Try the goals:1-append ([1,2],[3],L), append( L, L,LF).2-append ( L,[5,6], [1,2,3,5,6]).3-append (L1,L2, [1,2,3]).

21.9 Tracing the append goal

DOMAINS

intlist= integer*

PREDICATES

append (intlist, intlist, intlist)

CLAUSES

append ([], L2,L2 ).

append ([H | T1], L2,[H|T3] ):-

append (T1, L2, T3).

GOAL

append([1,2,3],[5,6],L).

L= [1,2,3,5,6].

append([1,2,3],[5,6],L).

append ([1 | [2,3] ],[5,6], [1|T3] ):-

append ([2,3 ],[5,6], [T3] ):-

append ([2 | [3] ],[5,6], [2|T3’] ):-

append ([3 ],[5,6], T3’ ):-

append ([3 | [ ] ],[5,6], [3|T3’’] ):-

append ([ ],[5,6], T3’’ ). T3’’ =[5,6]

T3’ =[3,5,6]

T3 =[2,3,5,6]

L =[1,2,3,5,6]

22 VPROLOG facts Section• The facts section is declared to allow a

programmer to add or remove facts at run time.• Facts declared in fact section are kept in tables

to allow modification, while normal facts are compiled into binary code for speed optimization.

1. To declare a fact in a fact section:• DOMAINS• person=string• FACTS -up• father (person, person)• CLAUSES• father (“samy”, “ali”).

Name of this fact section

22.1Updating the facts section• To add a fact to the facts section use

• asserta or assert to insert the new fact at the beginning of the fact section

• Example:– asserta( father(“ali”,”ahmad”)).

• assertz to add the fact at the end of its fact section.– assertz( father(“ahmad”,”khalil”)).

If we execute the goal father ( X,Y).,

The output will be as shown here:

Will be added before the fact:father (“samy”, “ali”).

Will be added after the fact:father (“samy”, “ali”).

X=ali, Y=ahmadX=samy, Y=aliX=ahmad, Y=khalil

• There is no automatic check in VPROLOG if you insert a fact twice, to prevent this you can declare the following predicate which tests a fact before adding it as follows:

• PREDICATES

• uassert(up)

• CLAUSES

uassert (father(F,S)):- father(F,S), ! ;

assert (father(F,S)).

Search for the fact if found breakElse assert it

22.2Saving and loading facts.

• To save the facts in a file you can use the save predicate as follows:

save (filename).Or

Save (filename, factsectionname).

• To load a fact database use consult as follows:

consult (filename, factsectionname).

DOMAINSperson=stringFACTS - up father (person, person)predicatesuassert (up)addfathersrepeat CLAUSESfather ("samy", "ali").uassert (father(F,S)):- father(F,S), ! ; assert (father(F,S)). repeat. repeat:- repeat. addfathers:- repeat,readln (F),readln (S), uassert(father(F,S)),F="",!,save("c:\\facts",up).

goalconsult(“c:\\facts”), addfathers, father(X,Y).

Removing facts• To remove a fact use the predicate retract as

follows: retract(<the fact>[,factsectionname]).

• Example to remove the fact father(“samy”,“ali”):

retract(father(“samy”,”ali”).

• To remove all facts about “samy” as a father:retract (father(“samy”,_)).Note: the previous program adds a father whose name

is null, to remove all facts that has a null string name modify the add father predicate as follows:

addfathers:- repeat,readln (F),readln (S), uassert(father(F,S)),F="",!, retract(father(F,S)), save("c:\\facts",up).

To remove the last entered fact with null strings