Föreläsning 2 Teori Unifiering Unifiering i Prolog Sökning efter bevis Övningar Ett lite större exempel: kampsport.pl Praktisk träning (hemläxa)
Målet med denna föreläsning Diskutera unifiering i Prolog Visa hur Prologs unifiering skiljer sig från standardunifiering Förklara den sökstrategi som Prolog använder sig av när den försöker härleda ny information från redan existerande dito, mha modus ponens
Unifiering Tänk på exemplet från förra FL, där vi konstaterade att Prolog unifierar med woman(x) woman(mia) och instantierar därmed variabeln X med atomen mia.
Repetition: Prologs termer Terms Simple Terms Constants Variables Atoms Numbers Complex Terms
Unifiering Working definition : Två termer unifierar om de är samma term eller om de innehåller variabler som kan uniformt instantieras med termer på så sätt att de resulterande termerna är lika.
Unifiering Detta betyder att: mia och mia unifierar 42 och 42 unifierar woman(mia) och woman(mia) unifierar Detta betyder också att: vincent och mia inte unifierar woman(mia) och woman(jody) inte unifierar
Unifiering Hur går det med... mia och X X
Unifiering Hur går det med... woman(z) och woman(mia) mia z
Unifiering Hur går det med... loves(mia,x) och loves(x,vincent) mia X loves(mia,mia) loves(mia, vincent) X kan ej bindas till två olika värden samtidigt! loves(vincent, vincent) X vincent
Instantieringar När Prolog unifierar två termer, utför det alla de nödvändiga instantieringarna, så att termerna därefter är lika Detta gör unifieringen en kraftig programmingsmekanism
Reviderad definition 1/3 1. Om T 1 och T 2 är konstanter, så unifierar T 1 och T 2 ifall de är samma atom eller samma tal. 2 2 mia mia
Reviderad definition 2/3 1.... 2. Om T 1 är en variabel och T 2 är vilken som helst term (any type of term), så unifierar T 1 och T 2, och T 1 instantieras till T 2. (och vice versa) X Y mia woman(mia)
Reviderad definition 3/3 1.... 2.... 3. Om T 1 och T 2 är komplexa termer så unifierar de ifall: a) De har samma funktor och aritet, och b) alla deras motsvarande argument unifierar, och c) variabelinstantieringarna är kompatibla.
Prologs unifiering: =/2?- mia = mia. yes?- = unifieringsoperator (inbyggt predikat)
Prologs unifiering: =/2?- mia = mia. yes?- mia = vincent. no?-
Prologs unifiering: =/2?- mia = X. X=mia yes?- Kan mia unifieras med X? Ja, och X instantieras då till mia.
Hur kommer Prolog att reagera??- X=mia, X=vincent. X? mia vincent
Hur kommer Prolog att reagera??- X=mia, X=vincent. no?-, = and Varför? Efter att ha jobbat genom det första delmålet har Prolog instantierat X till mia, så att det nu inte längre kan unifiera X med vincent. Därför misslyckas det andra delmålet.
Exempel med komplexa termer?- k(s(g),y) = k(x,t(k)).
Exempel med komplexa termer?- k(s(g),y) = k(x,t(k)). X=s(g) Y=t(k) yes?-
Exempel med komplexa termer?- k(s(g),t(k)) = k(x,t(y)).
Example with complex terms?- k(s(g),t(k)) = k(x,t(y)). X=s(g) Y=k yes?-
Ett sista exempel...?- loves(x,x) = loves(marsellus,mia).
Ett sista exempel...?- loves(x,x) = loves(marsellus,mia). no. loves(x,x) = loves(marsellus,marsellus). loves(x,x) = loves(mia,mia).... skulle fungera.
Prolog och unifiering Prolog använder inte en standard unifieringsalgoritm Betrakta följande förfrågning:?- father(x) = X. Unifierar dessa termer eller ej?
Infinita termer?- father(x) = X. X=father(father(father(father(father(father (father(father(father(father(father(father (father(father(father(father(father(father (father(father(father(father(father(father (father(father(father(father(father(father (father(father(father(father(father(father (father(father(father(father(father(father (father(father(father(father(father(father (
Infinita terms?- father(x) = X. X=father(father(father( )))) yes?-
Obs! swipl på tuxedo:?- father(x) = X. X = father(x)?-
Occurs Check En standard unifieringsalgoritm utför en occurs check Om den ombes att unifiera en variabel med en annan term kontrollerar den ifall variabeln ifråga ingår i termen I Prolog:?- unify_with_occurs_check(father(x), X). no
Occurs Check Prolog på tuxedo:?- father(x) = X. X = father(x).?- man(x) = X. X = man(x).?- unify_with_occurs_check(father(x),x). false.
Att programmera med unifiering vertical( line(point(x,y), point(x,z))). horizontal( line(point(x,y), point(z,y))). Y X
Att programmera med unifiering vertical( line(point(x,y), point(x,z))). horizontal( line(point(x,y), point(z,y))).?-
Programming with Unification vertical( line(point(x,y), point(x,z))). horizontal( line(point(x,y), point(z,y))).?- vertical(line(point(1,1),point(1,3))). yes?-
Att programmera med unifiering vertical( line(point(x,y), point(x,z))). horizontal( line(point(x,y), point(z,y))).?- vertical(line(point(1,1),point(1,3))). yes?- vertical(line(point(1,1),point(3,2))). no?-
Att programmera med unifiering vertical( line(point(x,y), point(x,z))). horizontal( line(point(x,y), point(z,y))).?- horizontal(line(point(1,1),point(1,y))). Y = 1; no?-
Att programmera med unifiering vertical( line(point(x,y), point(x,z))). horizontal( line(point(x,y), point(z,y))).?- horizontal(line(point(2,3),point)). Point = point(_554,3); no?-
Prolog på tuxedo... vertical( line(point(x,y), point(x,z))). horizontal( line(point(x,y), point(z,y))).?- horizontal(line(point(2,3),point)). Point = point(_g8, 3).?-
Att söka efter bevis Nu när vi vet om unifiering, kan vi börja se hur Prolog söker genom sin kunskapsbas för att se om ett mål kan satisfieras. Med andra ord: vi är redo att börja lära oss sökning efter bevis (proof search)
Exempel f(a). f(b). g(a). g(b). h(b). k(x):- f(x), g(x), h(x).?- k(y). För vilket/ vilka Y gäller k?
Exempel: sökträd (resolutionsträd) f(a). f(b). g(a). g(b). h(b). k(x):- f(x), g(x), h(x).?- k(y).?- k(y). Vi börjar med målet som ställdes.
Exempel: sökträd (resolutionsträd) f(a). f(b). g(a). g(b). h(b). k(x):- f(x), g(x), h(x).?- k(y). matcha Y mot X Y=X?- k(y).?- f(x), g(x), h(x). Nu får vi en hel del nya delmål från regelns kropp att bevisa
Exempel: sökträd (resolutionsträd) f(a). f(b). g(a). Y=X?- k(y). g(b). h(b). k(x):- f(x), g(x), h(x).?- k(y). matcha X mot a?- f(x), g(x), h(x). X=a?- g(a), h(a). Gäller dessa också?
Exempel: sökträd (resolutionsträd) f(a). f(b). g(a). g(b). h(b). k(x):- f(x), g(x), h(x).?- k(y).?- k(y). Y=X?- f(x), g(x), h(x). X=a?- g(a), h(a).?- h(a).
Exempel: sökträd (resolutionsträd) f(a). f(b). g(a). g(b). h(b). k(x):- f(x), g(x), h(x).?- k(y).?- k(y). Y=X?- f(x), g(x), h(x). X=a?- g(a), h(a).?- h(a). Misslyckades bevisa h(a)
Exempel: sökträd (resolutionsträd) f(a). f(b). g(a). g(b). h(b). k(x):- f(x), g(x), h(x).?- k(y).?- g(a), h(a).?- h(a).?- k(y).?- f(x), g(x), h(x). X=a Y=X X=b?- g(b), h(b). Ett nytt försök: x binds till b
Exempel: sökträd (resolutionsträd) f(a). f(b). g(a). g(b). h(b). k(x):- f(x), g(x), h(x).?- k(y).?- k(y). Y=X?- f(x), g(x), h(x). X=a X=b?- g(a), h(a).?- g(b), h(b).?- h(a).?- h(b).
Exempel: sökträd (resolutionsträd) f(a). f(b). g(a). g(b). h(b). k(x):- f(x), g(x), h(x).?- k(y). Y=b?- k(y). Y=X?- f(x), g(x), h(x). X=a X=b?- g(a), h(a).?- g(b), h(b).?- h(a).?- h(b). NU!
Exempel: sökträd (resolutionsträd) f(a). f(b). g(a). g(b). h(b). k(x):- f(x), g(x), h(x).?- k(y). Y=b; no?-?- k(y). Y=X?- f(x), g(x), h(x). X=a X=b?- g(a), h(a).?- g(b), h(b).?- h(a).?- h(b). Inga andra svar
Ett annat exempel loves(vincent,mia). loves(marsellus,mia). jealous(a,b):- loves(a,c), loves(b,c).?- jealous(x,y).
Ett annat exempel loves(vincent,mia). loves(marsellus,mia).?- jealous(x,y). jealous(a,b):- loves(a,c), loves(b,c).?- jealous(x,y).
Ett annat exempel loves(vincent,mia). loves(marsellus,mia).?- jealous(x,y). X=A Y=B jealous(a,b):- loves(a,c), loves(b,c).?- jealous(x,y).?- loves(a,c), loves(b,c). Vem är svartsjuk på vem...
Ett annat exempel loves(vincent,mia). loves(marsellus,mia).?- jealous(x,y). X=A Y=B jealous(a,b):- loves(a,c), loves(b,c).?- jealous(x,y).?- loves(a,c), loves(b,c). A=vincent C=mia?- loves(b,mia). Vilket/vilka B älskar mia?
Ett annat exempel loves(vincent,mia). loves(marsellus,mia).?- jealous(x,y). X=A Y=B jealous(a,b):- loves(a,c), loves(b,c).?- jealous(x,y). X=vincent Y=vincent?- loves(a,c), loves(b,c). A=vincent C=mia?- loves(b,mia). B=vincent Ingenting hindrar A = B
Ett annat exempel loves(vincent,mia). loves(marsellus,mia).?- jealous(x,y). X=A Y=B jealous(a,b):- loves(a,c), loves(b,c).?- jealous(x,y). X=vincent Y=vincent; X=vincent Y=marsellus?- loves(a,c), loves(b,c). A=vincent C=mia?- loves(b,mia). B=vincent B=marsellus Nu binds B till marsellus
Ett annat exempel loves(vincent,mia). loves(marsellus,mia).?- jealous(x,y). X=A Y=B jealous(a,b):- loves(a,c), loves(b,c).?- jealous(x,y). X=vincent Y=vincent; X=vincent Y=marsellus;?- loves(a,c), loves(b,c). A=vincent C=mia?- loves(b,mia). B=vincent B=marsellus A=marsellus C=mia?- loves(b,mia). A och C binds på nytt
Ett annat exempel loves(vincent,mia). loves(marsellus,mia).?- jealous(x,y). X=A Y=B jealous(a,b):- loves(a,c),. loves(b,c). X=vincent Y=marsellus; X=marsellus Y=vincent?- loves(a,c), loves(b,c). A=vincent A=marsellus C=mia C=mia?- loves(b,mia).?- loves(b,mia). B=vincent B=vincent B=marsellus
Ett annat exempel loves(vincent,mia). loves(marsellus,mia).?- jealous(x,y). X=A Y=B jealous(a,b):- loves(a,c),. loves(b,c). X=marsellus Y=vincent; X=marsellus Y=marsellus?- loves(a,c), loves(b,c). A=vincent A=marsellus C=mia C=mia?- loves(b,mia).?- loves(b,mia). B=vincent B=vincent B=marsellus B=marsellus
Ett annat exempel loves(vincent,mia). loves(marsellus,mia).?- jealous(x,y). X=A Y=B jealous(a,b):- loves(a,c),. loves(b,c). X=marsellus Y=vincent; X=marsellus Y=marsellus; no?- loves(a,c), loves(b,c). A=vincent A=marsellus C=mia C=mia?- loves(b,mia).?- loves(b,mia). B=vincent B=vincent B=marsellus B=marsellus
Ett nytt exempel: kampsport.pl
Ett nytt exempel: kampsport.pl /* Ett litet expertsystem om olika kampsporter - kan med fördel utvidgas */ kampart(kungfu). /* en gemensam benämning för ett flertal kinesiska kamparter */ kampart(karate). /* den tomma handens väg */ kampart(sumo). /* De välberömda massiva brottarna */ kampart(ninjutsu). /* ninjornas hemliga kampkonster */ kampart(aikido). /* den harmoniska vägen */ kampart(judo). /* den mjuka vägen (med hårda fall =) */ kampart(kendo). /* japansk svärd med parkamp */ kampart(iaido). /* konsten att dra det japanska svärdet - ensam */ kampart(kyudo). /* bågskyttets väg */ kampart(taido). /* kroppens väg - extremt akrobatiskt */ kampart(taekwondo)./* koreansk kampsport */ kampart(hapkido). /* mjukare koreansk kampsport */ kampart(kobudo). /* traditionella vapen från Okinawa */ kampart(tessenjutsu). /* den japanska kampsolfjäderns teknik */ kampart(katorishintoryu). /* vapenskola från 1400-talet */
Ett nytt exempel: kampsport.pl delgrenav(taiji, kungfu). delgrenav(wingchun, kungfu). delgrenav(prayingmantis, kungfu). delgrenav(choylifut, kungfu). delgrenav(shotokan, karate). delgrenav(shotokai, karate). delgrenav(goryu, karate). delgrenav(sankukai, karate). delgrenav(yuishinkai, karate).
Ett nytt exempel: kampsport.pl harstammarfran(kungfu, kina). harstammarfran(kobudo, okinawa). harstammarfran(karate, okinawa). harstammarfran(sumo, japan). harstammarfran(ninjutsu, japan). harstammarfran(aikido, japan). harstammarfran(judo, japan). harstammarfran(kendo, japan). harstammarfran(iaido, japan). harstammarfran(kyudo, japan). harstammarfran(taido, japan). harstammarfran(tessenjutsu, japan). harstammarfran(katorishintoryu, japan). harstammarfran(taekwondo, korea). harstammarfran(hapkido, korea). harstammarfran(x,y) :- delgrenav(x,z), harstammarfran(z,y).
Ett nytt exempel: kampsport.pl harstammarfran(x,y) :- delgrenav(x,z), harstammarfran(z,y).?- harstammarfran(karate, X). X = okinawa.?- harstammarfran(goryu, X). X = okinawa ; false.?- harstammarfran(x, okinawa). X = kobudo ; X = karate ; X = shotokan ; X = shotokai ; X = goryu ; X = sankukai ; X = yuishinkai ; false.
Ett nytt exempel: kampsport.pl vapen(sabel). /* det breda svärdet */ vapen(svard). /*smalare svärd, ex. katana */ vapen(spjut). /* ex. japansk yari */ vapen(kapp). /* hanbo, jo, bo */ vapen(bage). /* en lång båge för kyudo */ vapen(nunchaku). /* korta käppar med kedja emellan */ vapen(kusarifundo). /* en viktad kedja */ vapen(kusarigama). /* kedjevapen med en hacka i ena ändan */ vapen(shuriken). /* kaststjarna */ vapen(solfjader). /* japansk tessen eller taijishan */ vapen(naginata). /* tank dig en lång ishockeylatka, skarpt */ vapen(sai). /* en kort trespiksgaffel */ harvapen(x,y) :- har(x,y), vapen(y).
Ett nytt exempel: kampsport.pl?- harvapen(aikido, X). X = kapp ; X = svard ; false. Jag vill veta vilka vapen aikido har?- harvapen(aikido, _). true ; true ; false.?- harvapen(x, svard). X = kungfu ; X = ninjutsu ; X = taiji ; X = aikido ; X = kendo ; X = iaido ; X = katorishintoryu. Jag vill veta om aikido har vapen överhuvudtaget Jag vill veta vilka grenar som tränar med svärd
Ett nytt exempel: kampsport.pl harejvapen(x) :- kampart(x), not(harvapen(x,_)). /* X binds har till de olika kamparterna som sedan testas för vapen. Man skulle också kunna ställa frågan till systemet, och då får man samma svar. Vad man INTE kan ha är definitionen eller frågan */ not(harvapen(x,_)) ensam; systemresponsen blir "fail". not kan inte här användas för att generera de önskade svaren. Så fort harvapen(x,_) kan bevisas med något X och något vapen, misslyckas not.
Ett nytt exempel: kampsport.pl /* not(harvapen(x,_)) */ ensam; systemresponsen blir "fail". not kan inte här användas för att generera de önskade svaren. Så fort harvapen(x,_) kan bevisas med något X och något vapen, misslyckas not.?- not(harvapen(x, _)). false.
Ett nytt exempel: kampsport.pl harejvapen(x) :- kampart(x), not(harvapen(x,_)). /* X binds har till de olika kamparterna som sedan testas för vapen. Man skulle också kunna ställa frågan till systemet, och då får man samma svar. */?- harejvapen(x). X = karate ; X = sumo ; X = judo ; X = taido ; X = taekwondo ; X = hapkido ; false. Detta stämmer ju inte med verkligheten, men nog med vår slutna värld, där man inte explicit har registrerat några vapen för karate.
Ett nytt exempel: kampsport.pl harejvapen(x) :- kampart(x), not(harvapen(x,_)). /* X binds har till de olika kamparterna som sedan testas för vapen. Man skulle också kunna ställa frågan till systemet, och då får man samma svar. */?- harejvapen(x). X = karate ; X = sumo ; X = judo ; X = taido ; X = taekwondo ; X = hapkido ; false. Regeln harvapen borde korrigeras så, att om X är delgren av Y, och harvapen gäller för X, så gäller harvapen även för Y. Då räknas kobudos vapen som karates.
Ett nytt exempel: kampsport.pl harejfall(x) :- kampart(x), not(har(x, fallteknik)).?- harejfall(x). X = karate ; X = kendo ; X = iaido ; X = kyudo ; X = taido ; X = taekwondo ; X = kobudo ; X = tessenjutsu ; X = katorishintoryu. Om du inte gillar ukemin... Ljuger igen... taidos kast har inte blivit registrerade, och åtm goryu bland karategrenar förutsätter både kast och fall.
Ett nytt exempel: kampsport.pl har(yuishinkai, kast). har(sumo, kast). har(ninjutsu, kast). har(kungfu, kast). har(aikido, kast). har(judo, kast). har(jujutsu, kast). har(hapkido, kast). har(karate, sparkar). har(kungfu, sparkar). har(taekwondo, sparkar). har(jujutsu, sparkar). har(karate, slag). har(kungfu, slag). har(taekwondo, slag). har(jujutsu, slag). har(ninjutsu, slag). har(taido, slag). har(aikido, slag). har(ninjutsu, struptag). har(jujutsu, struptag). har(karate, tavlingar). har(kungfu, tavlingar). har(jujutsu, tavlingar). har(sumo, tavlingar). har(judo, tavlingar). har(kendo, tavlingar). har(taido, tavlingar). har(taekwondo, tavlingar). har(kungfu, sabel). har(kungfu, svard). har(kungfu, spjut). har(kobudo, kapp). har(kobudo, nunchaku). har(kobudo, sai). har(ninjutsu, kapp). har(ninjutsu, nunchaku). har(ninjutsu, kusarifundo).
Ett nytt exempel: kampsport.pl har(ninjutsu, kusarigama). har(ninjutsu, shuriken). har(ninjutsu, svard). har(taiji, solfjader). har(taiji, svard). har(taiji, sabel). har(aikido, kapp). har(aikido, svard). har(kendo, svard). har(iaido, svard). har(kyudo, bage). har(tessenjutsu, solfjader). har(katorishintoryu, kapp). har(katorishintoryu, spjut). har(katorishintoryu, svard). har(katorishintoryu, naginata). har(x, fallteknik) :- har(x, kast). har(x, blockeringar) :- har(x, slag). har(x, blockeringar) :- har(x, sparkar).
Ett nytt exempel: kampsport.pl?- har(x, sparkar). X = karate ; X = kungfu ; X = taekwondo ; X = jujutsu.?- har(x, blockeringar). X = karate ; X = kungfu ; X = taekwondo ; X = jujutsu ; X = ninjutsu ; X = taido ; X = aikido ; X = karate ; X = kungfu ; X = taekwondo ; X = jujutsu. Obs! Igen, ofullständig beskrivning; också ex. ninjutsu har både slag och sparkar... för att dom har slag för att dom har sparkar
Ett nytt exempel: kampsport.pl harjuniorverksamhet(aikido). harjuniorverksamhet(karate). harjuniorverksamhet(judo). harjuniorverksamhet(taido). harjuniorverksamhet(taekwondo). harjuniorverksamhet(jujutsu). ejforbarn(x) :- harvapen(x, _), not(harjuniorverksamhet(x)). ejforbarn(x) :- har(x, struptag), not(harjuniorverksamhet(x)). Strypningar tränas inte med barn under 15 år. När det tränas bland vuxna, ska åtm. en lärare med svart bälte vara närvarande.
Ett nytt exempel: kampsport.pl?- ejforbarn(karate). false.?- ejforbarn(aikido). false.?- ejforbarn(kungfu). true ; true ; true ; false. har(kungfu, sabel). har(kungfu, svard). har(kungfu, spjut).
Ett nytt exempel: kampsport.pl?- ejforbarn(kungfu). true ; true ; true ; false.?- trace. true. [trace]?- ejforbarn(kungfu). Call: (6) ejforbarn(kungfu)? creep Call: (7) harvapen(kungfu, _G393)? creep Call: (8) har(kungfu, _G393)? creep Exit: (8) har(kungfu, kast)? creep Call: (8) vapen(kast)? creep Fail: (8) vapen(kast)? creep Redo: (8) har(kungfu, _G393)? creep... har(kungfu, sabel). har(kungfu, svard). har(kungfu, spjut).
Ett nytt exempel: kampsport.pl Exit: (8) har(kungfu, sparkar)? creep Call: (8) vapen(sparkar)? creep Fail: (8) vapen(sparkar)? creep Redo: (8) har(kungfu, _G393)? creep Exit: (8) har(kungfu, slag)? creep Call: (8) vapen(slag)? creep Fail: (8) vapen(slag)? creep Redo: (8) har(kungfu, _G393)? creep Exit: (8) har(kungfu, tavlingar)? creep Call: (8) vapen(tavlingar)? creep Fail: (8) vapen(tavlingar)? creep Redo: (8) har(kungfu, _G393)? creep Exit: (8) har(kungfu, sabel)? creep Call: (8) vapen(sabel)? creep Exit: (8) vapen(sabel)? creep Exit: (7) harvapen(kungfu, sabel)? creep ^ Call: (7) not(harjuniorverksamhet(kungfu))? creep Call: (8) harjuniorverksamhet(kungfu)? creep Fail: (8) harjuniorverksamhet(kungfu)? creep ^ Exit: (7) not(user:harjuniorverksamhet(kungfu))? creep Exit: (6) ejforbarn(kungfu)? creep true ; har(kungfu, sabel). har(kungfu, svard). har(kungfu, spjut).
Ett nytt exempel: kampsport.pl Redo: (8) har(kungfu, _G393)? creep Exit: (8) har(kungfu, svard)? creep Call: (8) vapen(svard)? creep Exit: (8) vapen(svard)? creep Exit: (7) harvapen(kungfu, svard)? creep ^ Call: (7) not(harjuniorverksamhet(kungfu))? creep Call: (8) harjuniorverksamhet(kungfu)? creep Fail: (8) harjuniorverksamhet(kungfu)? creep ^ Exit: (7) not(user:harjuniorverksamhet(kungfu))? creep Exit: (6) ejforbarn(kungfu)? creep true ; har(kungfu, sabel). har(kungfu, svard). har(kungfu, spjut).
Ett nytt exempel: kampsport.pl Redo: (8) har(kungfu, _G393)? creep Exit: (8) har(kungfu, spjut)? creep Call: (8) vapen(spjut)? creep Exit: (8) vapen(spjut)? creep Exit: (7) harvapen(kungfu, spjut)? creep ^ Call: (7) not(harjuniorverksamhet(kungfu))? creep Call: (8) harjuniorverksamhet(kungfu)? creep Fail: (8) harjuniorverksamhet(kungfu)? creep ^ Exit: (7) not(user:harjuniorverksamhet(kungfu))? creep Exit: (6) ejforbarn(kungfu)? creep true ; har(kungfu, sabel). har(kungfu, svard). har(kungfu, spjut).
Ett nytt exempel: kampsport.pl Redo: (8) har(kungfu, _G393)? creep Call: (9) har(kungfu, kast)? creep Exit: (9) har(kungfu, kast)? creep Exit: (8) har(kungfu, fallteknik)? creep Call: (8) vapen(fallteknik)? creep Fail: (8) vapen(fallteknik)? creep Redo: (9) har(kungfu, kast)? creep Fail: (9) har(kungfu, kast)? creep Redo: (8) har(kungfu, _G393)? creep Call: (9) har(kungfu, slag)? creep Exit: (9) har(kungfu, slag)? creep Exit: (8) har(kungfu, blockeringar)? creep Call: (8) vapen(blockeringar)? creep Fail: (8) vapen(blockeringar)? creep Redo: (9) har(kungfu, slag)? creep Fail: (9) har(kungfu, slag)? creep Redo: (8) har(kungfu, _G393)? creep Call: (9) har(kungfu, sparkar)? creep Exit: (9) har(kungfu, sparkar)? creep Exit: (8) har(kungfu, blockeringar)? creep har(x, fallteknik) :- har(x, kast). har(x, blockeringar) :- har(x, slag). har(x, blockeringar) :- har(x,sparkar).
Ett nytt exempel: kampsport.pl Call: (8) vapen(blockeringar)? creep Fail: (8) vapen(blockeringar)? creep Redo: (9) har(kungfu, sparkar)? creep Fail: (9) har(kungfu, sparkar)? creep Fail: (8) har(kungfu, _G393)? creep Fail: (7) harvapen(kungfu, _G393)? creep Redo: (6) ejforbarn(kungfu)? creep Call: (7) har(kungfu, struptag)? creep Fail: (7) har(kungfu, struptag)? creep Fail: (6) ejforbarn(kungfu)? creep false. [trace]?- notrace. true. [debug]?- nodebug. true.?- Inga ytterligare sätt att bevisa varför kungfu inte lämpar sig för barn.
Det var det...
Sammandrag av dagens FL Under denna föreläsning har vi definierat unifiering tittat på skillnaden mellan standard unifiering och Prologs unifiering introducerat sökträd (resolutionsträd)
Nästa föreläsning Diskuterar rekursion i Prolog Introducerar rekursiva definitioner i Prolog Visar att det kan finnas diskrepanser mellan den deklarativa betydelsen av ett Prologprogram och dess procedurala betydelse.