310 likes | 602 Views
Logikprogrammering 10 P:. Onsdag 6 november 2002. Logikprogrammering 10 P: 5 november 2002 Idag: T R A C E och f e l s ö k n i n g. I dagens föreläsning:. T r a c e [ S p å r n i n g ] O c h f e l s ö k n i n g Först något från tidigare föreläsningar:.
E N D
Logikprogrammering 10 P: Onsdag 6 november 2002 Kenneth Wilhelmsson [kw@ling.gu.se]
Logikprogrammering 10 P: 5 november 2002Idag: T R A C Eoch f e l s ö k n i n g Kenneth Wilhelmsson [kw@ling.gu.se]
I dagens föreläsning: • T r a c e • [ S p å r n i n g ] • O c h f e l s ö k n i n g • Först något från tidigare föreläsningar: Kenneth Wilhelmsson [kw@ling.gu.se]
Användning av cut red(a). black(b). color(P,red) :- red(P),!. color(P,black) :- black(P),!. color(P,unknown). ?- color(a,C). C = red Kenneth Wilhelmsson [kw@ling.gu.se]
Kommentarer angående fall två – (varför ej placera cut efter b – den kommer ju ändå att fortsätta med b) p :- a, b. p :- c. [p gäller omm (a & b) ELLER c] p :- a, !, b. p :- c.[p gäller omm (a& b) ELLER (INTE a & c)] p :- c. p :- a, !, b. [p gäller omm c ELLER (a & b)] (”omm” är detsamma som<==>) Kenneth Wilhelmsson [kw@ling.gu.se]
Några viktiga poänger från föregående föreläsningar: • kommentering i koden • programmeringsstil • alltså: lättförståelig kod • bra namn (indikera vad procedurer och variabler har för mening) • ett ’bra’ namn är också lätt att komma ihåg • välj en ”standard” och håll fast den! Kenneth Wilhelmsson [kw@ling.gu.se]
Vanliga misstag(föregående föreläsning) • glömt punkten, eller ersatt med ’,’ • inget whitespace efter punkten (t ex glömt trycka return efter sista punkten i filen…) • mismatchade par. (t ex ’[’ och ’]’ eller ’/*’ och ’*/’). • felstavnign av predikat (speciellt inbyggda är svåra att hitta) • likartade namn som matchar (t ex råkar skriva ’appends’ för append, och jag har definierat ett predikat som heter appends som gör nåt helt annat!) Kenneth Wilhelmsson [kw@ling.gu.se]
Att ev betänka • Stavning ger upphov till mycket fel • Likalåtande predikat • Använd gärna _ mellan_ord • (eLLER vAR åTMINSTONE kONSEKVENT) Kenneth Wilhelmsson [kw@ling.gu.se]
”Idealisk” kod är kod som i ett avseende är simpel eller enkel • kort och tydligt: • korta klausuler • korta procedurer • följer ofta automatiskt om ’sub-problemen’ är noggrant definierade Kenneth Wilhelmsson [kw@ling.gu.se]
Visualisera strukturen, bilder • deklarativt språk (sekvens eller ’ordning’ spelar inte så stor roll i bilder) • datastrukturer (t ex träd) lämpar sig för bilder (av just träd!) • relationer mellan objekt lättare att rita än att beskriva i ord Kenneth Wilhelmsson [kw@ling.gu.se]
Dagens föreläsning: trace/spårning • Vad är trace – spårning? • En spårning är en beräkning - följden av valda mål i sökträdet till en fråga. Kenneth Wilhelmsson [kw@ling.gu.se]
Anknytning till tidigare föreläsningar Se till att ge akt t o m på varningar som t ex singleton variables. - Kan vara nödvändigt för att få en labbhandledare att kontrollera programmet… Kenneth Wilhelmsson [kw@ling.gu.se]
Trace I varje steg i en spårning anger man det valda målet och eventuella bindningar som uppkommer på variabler i det valda målet då det reduceras. Kenneth Wilhelmsson [kw@ling.gu.se]
Trace • Man sätter på debuggern (spåraren) med kommandot trace. i SICStus Prolog. Kenneth Wilhelmsson [kw@ling.gu.se]
Trace/Step I andra prologversioner finns i stället predikatet step. Kenneth Wilhelmsson [kw@ling.gu.se]
Trace Trace innehåller ”kommandon”: Call, Exit, RedoochFail. Dessa beskriver vad spårningen tar sig för. Stegvis anropas ett av de fyra kommandona åt gången. Kenneth Wilhelmsson [kw@ling.gu.se]
Call, fail och redo Call sker när Prolog inleder ett försök att uppfylla ett mål (goal). Exit sker när ett mål har uppfyllts. Redo sker när systemet kommer tillbaka till ett mål och försöker uppfylla det igen. Fail sker när ett mål misslyckas. Kenneth Wilhelmsson [kw@ling.gu.se]
Mode-deklarationer Mode-deklarationer talar om på vilka sätt man kan använda ett predikat. namn(arg, …, arg) +ArgNamn – Argumentet bör vara instantierat till en variabelfri term -ArgNamn – Argumentet bör vara oinstantierat ?ArgNamn – Argumentet kan vara båda :ArgNamn – Prediakatet bör vara instantierat till ett predikatsnamn Kenneth Wilhelmsson [kw@ling.gu.se]
Ett program som exempel %% man(?Person) %% Person är en man man(robert). man(rune). man(bengt). %% pappa(?Person, ?Barn) %% Person är pappa till Barn pappa(rune, robert). pappa(bengt, rune). %% farfar(?Person, ?Barnbarn) %% Person är farfar till Barnbarn farfar(Person, Barnbarn) :- pappa(Person, Barn), pappa(Barn, Barnbarn). Kenneth Wilhelmsson [kw@ling.gu.se]
pappa(rune, robert). • pappa(bengt, rune). • farfar(Person, Barnbarn) :- • pappa(Person, Barn), • pappa(Barn, Barnbarn). Kenneth Wilhelmsson [kw@ling.gu.se]
Trace En spårning kan ibland uppfattas som ganska svårtydd och vara komplicerad att följa – se därför till att vara extra noggrann med att att lösa ”singleton variables” och andra ”obetydliga” fel som tenderar att göra spårning tidsödande och ännu komplexare. Kenneth Wilhelmsson [kw@ling.gu.se]
apa(X) :- bepa(X), cepa(X). apa(X) :- depa(X). cepa(X) :- depa(Y), X is Y - 1. bepa(1). bepa(2). depa(3). Nytt program: apa bepa cepa(klassiska namn…)(exempel1.pl) För vilka värden på X gäller apa(X)? Kenneth Wilhelmsson [kw@ling.gu.se]
Summa-exemplet (summa.pl) %% summa(Summa, Tal1, Tal2) %% Summa är summan av Tal1 och Tal2, Alla tal anges med %% "successor"-notationen för naturliga tal. summa(Tal, 0, Tal). summa(s(Summa), s(Tal1), Tal2) :- summa(Summa, Tal1, Tal2). Kenneth Wilhelmsson [kw@ling.gu.se]
Summa-exemplet (summa.pl) Kenneth Wilhelmsson [kw@ling.gu.se]
”Trace är egentligen ett specialfall av spy” (Man tar bort trace genom att skriva notrace) Spy: spec - Skriv t ex spy member/2. • Spy: [predikat] betyder att man sätter en spy point på ett predikat och får se hur det anropas. Nospy:spec och nospyall tar bort. • ”Trace är ett spy” - ”med alla flaggor påslagna” - ”Trace” ger ”exhaustive tracing” Kenneth Wilhelmsson [kw@ling.gu.se]
KOMMANDON UNDER EN SPÅRNING Creep (c) - (som return – stega framåt) Leap (l) - kör på tills vi hittar en spy-point eller ett svar Skip (s) – hoppa över ett predikat, fungerar enbart vid anropen call och redo Help (h) – visar de kommandon som man kan använda sig av i debuggern Kenneth Wilhelmsson [kw@ling.gu.se]
Visa en större del av det aktuella predikatet Skriv p direkt följt av en siffra – denna siffra anger antalet visade argument: T ex p10 Kenneth Wilhelmsson [kw@ling.gu.se]
Ett annat sätt att sätta spy-point • Skriv ’trace.’ • Stega ner till ett predikat som är intressant. • Skriv ’+’. (Detta innebär att predikatet får en spy-point) • Skriv ’l’ – nästa spy-point visas • (Skriv ’-’ för att ta bort spy-pointet från ett visst predikat) Kenneth Wilhelmsson [kw@ling.gu.se]
Leash • Nodebug notrace nozip Kenneth Wilhelmsson [kw@ling.gu.se]