Filosofiska institutionen Göteborgs universitet UTKAST Resolution, unifiering och syntaktiska modeller En introduktion till logikprogrammeringens teori Björn Haglund Detta är ett ofärdigt utdrag ur ovanstående text. Vänligen sprid inte!
Innehåll 0 Några konventioner 2 1 Definitioner 2 2 Notation 3 3 Terminologi 5 4 Från standardform till klausulform 5 5 Herbrand-tolkningar 10 6 Herbrands sats och grundresolution 11 7 Unifiering 15 8 Allmän resolution 19 9 En indeterministisk bevisalgoritm 21 1
0 Några konventioner I det följande kommer vi att använda ω som symbol för mängden av naturliga tal, dvs ω = {0, 1, 2, 3,...} i, k ω betyder att i och k är naturliga tal, dvs att i = 0 eller 1 eller 2 eller... och att k = 0 eller 1 eller 2 eller... Märk att om vi skriver A 1, A 2,..., A n,... (n ω), så inkluderar vi fallen n = 0 (innebär tom lista) och n = 1 (innebär lista med ett element). Listan A 0, A 1,..., A n, (n ω) har dock alltid minst ett element. För att ange att två formler är logiskt ekvivalenta använder vi ibland symbolen. φ ψ betyder alltså att φ och ψ är logiskt ekvivalenta. används för att beteckna en absurd sats, dvs en sats som är falsk i varje modell, eller m.a.o. en sats som inte är satisfierbar. x (x = x) eller (φ φ) för lämpligt φ används för att beteckna en valid sats, dvs en sats som är sann i varje modell. x(x = x), eller (φ φ) för lämpligt φ 1 Definitioner En atom är en atomär formel, dvs en predikatsymbol följd av så många termförekomster (inom parentes och åtskiljda av kommatecken) som dess ställighet anger. En atom är således en formel utan (andra) logiska konstanter (än identitetssymbolen). En literal är en atom (=positiv literal) eller en negerad atom (=negativ literal). En klausul är en disjunktion av literaler, dvs av atomer och negerade atomer. En sats sägs vara i klausulform om den är av formen x 1 x 2... x i (C 1 C 2... C k ), (i, k ω), där varje konjunkt är en klausul. (Följden av kvantifikatorer ( x 1 x 2... x i ) kallas formelns prefix, och konjunktionen av klausuler (C 1 C 2... C k ) kallas formelns matris.) 2
x y z((p (x) Q(y)) (R(x, f(y)) P (z)) Q(a)) är en sats i klausulform. (Kontrollera!) 2 Notation Eftersom satser i klausulform spelar så stor roll i logikprogrammering har man infört en speciell notation för dem. En klausul är ju en disjunktion av literaler. Men eftersom disjunktion dels är kommutativ (dvs A B är logiskt ekvivalent med B A) och dels är associativ (dvs (A B) C är ekvivalent med A (B C)) och dessutom idempotent (dvs A A är ekvivalent med A), så kan vi i praktiken betrakta en klausul som en mängd av formler. (Vi bortser med andra ord från ordning mellan, och antal förekomster av, literaler i en klausul, liksom naturligtvis från parentesstrukturer.) Vi kan till att börja med införa beteckningssättet (A 1 ; A 2 ;... ; A n ; B 1 ; B 2 ;... ; B m ) för en klausul, där A 1, A 2,..., A n är de positiva literalerna (=atomerna) och B 1, B 2,..., B m är de negativa literalerna (=negerade atomerna) i klausulen, (n, m ω). Att det är fråga om en klausul framgår bl.a. av att vi använder semikolon, som alltså skall utläsas som ett disjunktionstecken. Vanligtvis skriver man dock inte på detta sätt utan på följande: (A 1 ; A 2 ;... ; A n B 1, B 2,..., B m ) Detta är alltså den vanliga notationen för en klausul. (Ofta utelämnas dessutom parenteserna). Den kan läsas ut på följande sätt: A 1 eller A 2 eller... eller A n om B 1 och B 2 och... och B m. Märk att vi läser ut kommatecknen som konjunktioner. En motivering till detta får vi om vi lägger märke till att bara är ett annat sätt att skriva formeln (A 1 ; A 2 ; B 1 ; B 2 ) (A 1 A 2 B 1 B 2 ) 3
som är ekvivalent med och med och, slutligen, med enligt vanlig satslogik. (( B 1 B 2 ) (A 1 A 2 )) ( (B 1 B 2 ) (A 1 A 2 )) (B 1 B 2 A 1 A 2 ) Skriver vi ut den sista formeln med implikationspilen baklänges och med disjunktioner och konjunktioner utbytta mot semikolon respektive kommatecken, så får vi den vanliga klausulnotationen. Låt oss nu kort återvända till satser i klausulform, dvs satser av formen x 1 x 2... x i (C 1 C 2... C k ) där varje C n är en klausul Eftersom (generellt) x(φ ψ) xφ xψ, dvs allkvantifikatorn distribuerar över konjunktion, är en sats i klausulform ekvivalent med en konjunktion av universellt slutna klausuler. Eftersom vidare konjunktion (liksom disjunktion) är associativ, kommutativ och idempotent, kan vi identifiera en sats i klausulform med en mängd av sådana universellt slutna klausuler. Vi kommer i fortsättningen, om inget annat sägs, att underförstå att klausuler är universellt slutna, dvs att varje förekomst av en variabel i en klausul är bunden av en (ej utskriven) allkvantifikator framför klausulen. En kommentar: Eftersom allkvantifikatorn distribuerar över konjunktion, och slutna variabler kan bytas mot andra slutna variabler utan förändring av formlers mening, finns det ingen möjlighet att uttrycka samband mellan olika klausuler med hjälp av variabler. T.ex. betyder x(p (x) Q(x)) detsamma som zp (z) yq(y)( z y(p (z) Q(y))) Däremot kan samband mellan olika literaler inom en klausul anges med hjälp av variabler. x(p (x) Q(x)) betyder något annat (svagare) än zp (z) yq(y)( z y(p (z) Q(y))) (Man brukar säga att variabler har lokal betydelse inom en klausul.) 4
3 Terminologi I en klausul (A 1 ; A 2 ;... ; A n B 1, B 2,..., B m ), (n, m ω) kallas delen A 1 ; A 2 ;... ; A n, dvs den del av klausulen som omfattar de positiva literalerna, för klausulens huvud (konsekvensdel, konsekvent) och delen B 1, B 2,..., B m, dvs den del som omfattar de negativa literalerna, för klausulens kropp (villkorsdel, antecedent). En programklausul (Hornklausul) är en klausul av formen (A B 1,..., B m ), dvs en klausul med exakt en positiv literal. En enhetsklausul (ovillkorlig klausul, faktum ) är en programklausul med tom kropp, dvs en klausul av formen (A ). Ett logikprogram är en ändlig mängd av programklausuler. I ett logikprogram kallas mängden av programklausuler med samma huvud A en definition av predikatet i A. (Kom ihåg att A är en atom, dvs av formen P (t 1,..., t n ) för ett predikat P och termer t 1,..., t n.) Elementen i en definition kallas ibland definitionsklausuler eller regler. En målklausul (frågeklausul) är en klausul med tomt huvud, dvs en klausul av formen ( B 1,..., B m ). B i (i = 1,..., m) kallas för målklausulens delmål (delfrågor). Några kommentarer: Låt oss först konstatera att varje logikprogram är ekvivalent med en sats i klausulform. (Däremot gäller inte omvändningen, eftersom inte varje klausul är en programklausul.) Med hjälp av t ex en sanningsvärdestabell kan vi konstatera att A A för alla formler A. För en icketom klausul C, betraktad som en mängd av literaler, innebär detta att C C { } och (eftersom ) att C C { }. Vi kan m.a.o. alltid lägga till i klausulhuvudet och/eller i klausulkroppen utan att ändra klausulens logiska egenskaper. Vi bestämmer oss nu för att detsamma skall gälla även för tomma klausuler, dvs ( ) ( ) 4 Från standardform till klausulform Vi skall här presentera metoder att till en given sats φ i ett första ordningens språk konstruera en sats ψ i klausulform, så att φ har en modell omm ψ har en modell (eller m.a.o. så att φ är satisfierbar omm ψ är satisfierbar). Det intressantaste i dessa metoder är sättet att eliminera existenskvantifikatorer i 5
formler. (Minns att prefixet i en sats i klausulform endast innehåller allkvantifikatorer.) Existenskvantifikatorer kan elimineras via introduktion av s.k. Skolemfunktioner. Så först en kort introduktion till sådana. Att en sats xφ(x) är sann i en modell M betyder ju att det finns en individ a i modellens domän som satisfierar φ(x) (dvs att M φ(c), där c är en individkonstant som denoterar a) Om, omvänt, M φ(c) (för ngt c) så M xφ(x). Det följer att xφ(x) är satisfierbar omm φ(c) är satisfierbar för någon individkonstant c. (Däremot gäller inte att xφ(x) φ(c).) Vi kan alltså, med bevarande av satisfierbarhetsegenskaper, eliminera en existenskvantifikator som står först i en formel genom att införa en ny individkonstant. Om existenskvantifikatorn föregås av allkvantifikatorer fungerar dock inte metoden med individkonstanter. T ex är x y(x y) sann i varje modell med minst två element i domänen (och alltså satisfierbar), medan x(x c) inte är satisfierbar. Det gäller dock att om x yφ(x, y) har en modell M, så kan man till varje a M hitta b M så att (a, b) satisfierar φ(x, y) i M. Alltså finns en funktion f : M M sådan att för alla a M gäller att (a, f(a)) satisfierar φ(x, y) i M. En sådan funktion kallas en Skolemfunktion. Det är också klart att om xφ(x, f(x)) är sann i en modell M, så är x yφ(x, y) sann i samma modell. På liknande sätt kan man se att x 1... x n yφ(x 1,..., x n, y) är satisfierbar omm x 1... x n φ(x 1,..., x n, f(x 1,..., x n )) är det. Genom att införa nya funktionssymboler i språket kan vi alltså eliminera även existenskvantifikatorer som föregås av allkvantifikatorer. Även konstanter kan betraktas som funktioner (med konstant värde).eftersom värdet på en sådan funktion är oberoende av argumentens värden kan man låta den vara argumentlös, dvs nollställig. Med en sådan konvention kan man alltså ge en uniform beskrivning av metoden att eliminera existenskvantifikatorer. En existenskvantifikator y som föregås av n allkvantifikatorer x 1 x 2... x n, n ω kan elimineras genom att alla förekomster av variabeln y ersätts med förekomster av termen f(x 1, x 2,..., x n ), där f är en ny funktionssymbol. Vi skall nu beskriva en metod att till en given formel φ konstruera en sats ψ i klausulform, så att φ är satisfierbar omm ψ är det. (Märk att metoden faktiskt gäller för godtyckliga formler, även om vi egentligen bara är intresserade av satser. Förklaringen finns i steg 1a i följande algoritm: 6
(Stegen 1b, 5 och 9 är inte obligatoriska) 1. (a) Forma det existentiella höljet av φ, dvs lägg till ett prefix av existenskvantifikatorer framför φ så att alla fria variabler i φ blir bundna. (Om φ redan är en sats händer alltså ingenting i detta steg.) Ex: x yr(z, x) z x yr(z, x) (b) Stryk alla redundanta kvantifikatorer, dvs stryk alla kvantifikatorer som inte binder någon vaniabel. Ex: z x yr(z, x) z xr(z, x) 2. Byt variabler som är kvantifierade mer än en gång tills varje kvantifikator binder en unik variabel. Ex: x( xp (x) y(q(x) xr(x, y))) x( zp (z) y(q(x) ur(u, y))) 3. Eliminera alla konnektiver utom, och. φ ψ ( φ ψ) ( ψ φ) φ ψ ( φ ψ) 4. Flytta alla negationer så långt in som möjligt, tills alla negationstecken står omedelbart framför en atomär formel, och eliminera dubbla negationer. xφ x φ xφ x φ (φ ψ) φ ψ (φ ψ) φ ψ φ φ 5. Flytta kvantifikatorer åt höger: Qx(φ ψ) φ Qxψ om x ej fri i φ Qx(φ ψ) Qxφ ψ om x ej fri i ψ där Q =, och =,. T ex: x(φ ψ) φ xψ om x ej fri i φ x(φ ψ) xφ ψ om x ej fri i ψ 6. Eliminera alla existenskvantifikatorer (med början från vänster) med hjälp av (symboler för) Skolemfunktioner. 7. Flytta allkvantifikatorer åt vänster, tills alla sådana står i början av formeln (dvs tills ingen allkvantifikator föregås av något annat än allkvantifikatorer). 8. Distribuera (så långt det går) över (dvs skriv om formelns matris på konjunktiv normalform). 7
(φ ψ) γ (φ γ) (ψ γ) φ (ψ γ) (φ ψ) (φ γ) 9. Förenkla formeln på sådana sätt som bevarar satisfierbarhetsegenskaper, t ex genom att (a) eliminera dubblerade literaler i samma klausul Ex: (P (x, a) Q(y) P (x, a)) (P (x, a) Q(y)) (b) stryka tautologa klausuler (dvs klausuler som innehåller både en atom och dennas negation). Vi skall tillämpa algoritmen på formeln x(p (x) z( y(q(x, y) P (f(u))) y(q(x, y) P (x)))) Steg 1: Tag existentiella höljet och stryk z u x(p (x) ( y(q(x, y) P (f(u))) y(q(x, y) P (x)))) Steg 2: Byt namn på variabeln y som är kvantifierad två gånger u x(p (x) ( y(q(x, y) P (f(u))) z(q(x, z) P (x)))) Steg 3: Eliminera förekomster av u x( P (x) ( y( Q(x, y) P (f(u))) z( Q(x, z) P (x)))) Steg 4: Flytta in negationer u x( P (x) ( y(q(x, y) P (f(u))) z( Q(x, z) P (x)))) Steg 5: Flytta kvantifikatorer åt höger u x( P (x) (( yq(x, y) P (f(u)))) ( z Q(x, z) P (x)))) Steg 6: Eliminera existenkvantifikatorerna x( P (x) ((Q(x, g(x)) P (f(a)))) ( z Q(x, z) P (x)))) Steg 7: Flytta fram allkvantifikatorer x z( P (x) ((Q(x, g(x)) P (f(a)))) ( Q(x, z) P (x)))) 8
Steg 8: Distribuera över (i två steg) x z(( P (x) Q(x, g(x))) ( P (x) P (f(a))) ( P (x) Q(x, z) P (x))) Steg 9: Förenkla; tredje klausulen är tautolog och stryks ( z blir då redundant och stryks) x(( P (x) Q(x, g(x))) ( P (x) P (f(a)))) Man kan också, med bevarande av satisfierbarhetsegenskaper, stryka den andra förekomsten av P (x), och får då resultatet x(( P (x) Q(x, g(x))) P (f(a))) vilket dock är lite svårare att se. Några kommentarer: Skriver vi resultatet i exemplet ovan i klausulnotation får vi Q(x, g(x)) P (x) P (x), P (f(a)) eller med den antydda ytterligare förenklingen Q(x, g(x)) P (x) P (f(a)) Märk att satsen i exemplet alltså inte svarar mot ett logikprogram! Låt oss också kort beröra motivet för att ta med steg 5 algoritmen. Skälet är att vi vill minimera antalet argument i de Skolemfunktioner som introduceras i steg 6. Om vi t ex applicerar steg 6 direkt på får vi som resultat: x y z u(p (z, y) Q(x, u)) x z(p (z, f(x)) Q(x, g(x, z))) dvs vi måste införa en 1-ställig och en 2-ställig funktionssymbol. Om vi istället först applicerar steg 5 får vi till att börja med y zp (z, y) x uq(x, y) varefter steg 6 ger och steg 7 ger zp (z, a) xq(x, h(x)) z x(p (z, a) Q(x, h(x))) 9
dvs vi behöver bara introducera en konstant (eller 0-ställig funktion) och en 1- ställig funktion. Ur logisk synvinkel (dvs satisfierbarhetsmässigt) är resultaten likvärdiga, men från en praktisk (evalueringsmässig) synpunkt är den senare formeln bättre. Även redundanta allkvantifikatorer som föregår existenskvantifikatorer ger upphov till onödiga argument i Skolemfunktioner, så även steg 1b (som ur strikt logisk synvinkel är likgiltigt) leder till beräkningsmässiga vinster. (Formuleringen av steg 5 förutsätter för övrigt att steg 1b genomförts.) 5 Herbrand-tolkningar Definitionsmässigt är en sats osatisfierbar omm den är falsk i varje tolkning (för formelns språk). Från beviset av fullständighetssatsen I LOGIKKOMPENDIET vet vi dock att vi inte behöver ta hänsyn till alla tolkningar, utan det räcker att betrakta Henkin-tolkningar, dvs sådana vilkas domän består av (ekvivalensklasser av) individkonstanter. Vi skall här kort beskriva en annan typ av syntaktiska tolkningar, sk Herbrandtolkningar, vilkas domän består av slutna termer. För att förenkla framställningen skall vi tills vidare utgå från språk utan identitetssymbol (och i form av anmärkningar påpeka vilka förändringar som måste till för att klara även språk med identitet). Vi börjar med att till en sats φ definiera φ s Herbrand-domän, som vi betecknar med H(φ): H(φ) är mängden av alla slutna termer som kan konstrueras utifrån de individkonstanter och funktionssymboler som förekommer i φ. (Om φ inte innehåller någon individkonstant, så använder vi en godtycklig ny individkonstant vid konstruktionen.) φ = x(p (a) Q(b) P (f(x))) H(φ) = {a, b, f(a), f(b), f(f(a)), f(f(b)), f(f(f(a))),...} ψ = x yp (f(x), y, g(x, y)) H(ψ) = {c, f(c), g(c, c), g(c, f(c)), f(g(c, c)), g(c, g(f(c), c)),...} En Herbrand-tolkning för φ är en tolkning (H(φ), T ) (för L φ ) sådan att: 10
1. T (t) = t för varje sluten term i L φ 2. T (f) är en funktion som avbildar (t 1,..., t n ) på f(t 1,..., t n ) för varje n- ställig funktionssymbol f L φ, t 1,..., t n H(φ) Några restriktioner på hur predikat i L φ skall tolkas finns inte. Olika tolkningar av predikat ger alltså upphov till olika Herbrand-tolkningar. En Herbrand-modell för φ är en Herbrand-tolkning för φ i vilken φ är sann. Huvudresultatet i detta avsnitt är följande: En sats i klausulform är satisfierbar omm den har en Herbrand-modell eller (ekvivalent): En sats φ i klausulform är osatisfierbar omm den är falsk i varje Herbrand-tolkning för φ. Observera att satsen är formulerad endast för satser i klausulform. T ex är satsen φ = P (a) x P (x) satisfierbar (i en tolkning med (minst) två element i domänen), men falsk i varje Herbrand-tolkning för φ. (H(φ) = {a}.) φ är inte heller på klausulform. Skriver vi om φ med algoritmen i förra avsnittet får vi satsen ψ = P (a) P (b) eller: P (a) P (b) som är på klausulform, och har en Herbrand-modell. (H(ψ) = {a, b}.) I en Herbrand-tolkning denoterar varje sluten term sig själv, dvs olika termer denoterar alltid olika objekt. Vill man utvidga resultatet i detta avsnitt till språk med identitet måste man därför göra vissa modifieringar (precis som i fallet med Henkin-tolkningar I LOGIKKOMPENDIET). Det som behövs är att man övergår till domäner av ekvivalensklasser av slutna termer, och bestämmer att dessa klasser denoteras av sina element. 6 Herbrands sats och grundresolution Först lite terminologi: Låt φ = x 1... x n (C 1... C m ) vara en sats i klausulform. En Herbrandinstans av en klausul C i i φ är resultatet av att ersätta alla förekomster av variabler 11
i C i med element i H(φ), dvs med förekomster av slutna termer ur φ s Herbranddomän (så att förekomster av samma variabel ersätts med förekomster av samma term). (Det som här kallats Herbrand-instanser kallas ibland grundinstanser, slutna instanser eller konstanta instanser. Dessa uttryck används dock även för resultatet av att ersätta variabler med godtyckliga slutna termer, alltså inte enbart termer ur H(φ).) Ett viktigt teorem som utgör grundvalen för resolutionsmetoden och därmed för logikprogrammering är Herbrands sats: En sats i klausulform är satisfierbar omm varje konjunktion av Herbrandinstanser av dess klausuler är satisfierbar. Eller (ekvivalent): En sats i klausulform är osatisfierbar omm det finns en (ändlig) konjunktion av Herbrand-instanser av dess klausuler som är osatisfierbar (dvs en kontradiktion). Poängen med satsen är, lite löst uttryckt, att den låter oss reducera ett predikatlogiskt avgörbarhetsproblem till ett satslogiskt (eller mer precist till en mängd av sådana). För en given sats φ kan vi först konstruera en sats ψ i klausulform som är satisfierbar omm φ är det. För ψ kan vi succesivt generera elementen i H(ψ), och därmed Herbrand-instanserna av ψ s klausuler, och efterhand testa konjunktioner av sådana med avseende på satisfierbarhet. (Sådana förfaringssätt kallas Herbrandmetoder.) Som vi vet kan testning av satisfierbarhet för satslogiska formler göras med tabellmetoden. Detta är dock en (vedervärdigt) ineffektiv metod. För konjunktioner av slutna klausuler (dvs satser på konjunktiv normalform) kan man i stället använda s.k. grundresolution, som bygger på följande bevisregel: Givet två (slutna) klausuler C 1 och C 2 som innehåller en literal L respektive dennas negation L, konstruera en ny klausul C 3 (kallad resolventen av C 1 och C 2 ) genom att stryka alla förekomster av L och L i C 1 och C 2, bilda disjunktionen av alla återstående literaler i C 1 och C 2, och eliminera eventuella dubbla förekomster av literaler. C 1 = (P (a) Q(b) R(a, c)) = P (a); Q(b) R(a, c) C 2 = (R(a, c) P (b) Q(b)) = R(a, c); Q(b) P (b) 12
C 3 = (P (a) Q(b) P (b)) = P (a); Q(b) P (b) Huvudsatsen för grundresolutionsmetoden (för språk utan identitet) är: En konjunktion σ av (slutna) klausuler är osatisfierbar omm den tomma klausulen kan härledas från σ med hjälp av resolutionsregeln. σ = (P (a) Q(b)) (P (a) R(a)) ( P (a) R(a)) ( P (a) Q(b))...... (R(a) Q(b)) ( R(a) Q(b)) eller i klausulnotation: 1. P (a); Q(b) 2. P (a) R(a) 3. R(a) P (a) 4. P (a), Q(b) 5. R(a) Q(b) 6. Q(b) R(a) Med resolutionsregeln får vi: 7. Q(b); R(a) (ur (1) och (3)) 8. Q(b) (ur (6) och (7)) 9. R(a), Q(b) (ur (2) och (4)) 10. Q(b) (ur (5) och (9)) 11. (ur (8) och (10)) σ är alltså inte satisfierbar. Låt σ bestå av följande klausuler 1. P (a); Q(b) 13
2. Q(b) 3. Q(b) P (a), R(a) Genom att systematiskt gå igenom alla sätt att använda resolutionsregeln finner vi att R(a) är den minsta klausul som kan härledas. σ är alltså satisfierbar. Låt σ bestå av följande klausuler 1. R(a) P (a), Q(b) 2. Q(b) P (a) 3. P (a) 4. R(a) Med resolutionsregeln får vi 5. R(a) P (a) (ur (1) och (2)) 6. R(a) (ur (3) och (5)) 7. (ur (4) och (6)) σ är alltså kontradiktorisk. Låt oss också titta på ett exempel som visar att inskränkningen till språk utan identitet är väsentlig. Satsen (P (a) a = b P (b)) är uppenbarligen motsägelsefull. Men ur 1. P (a) 2. a = b 3. P (b) kan vi inte med resolutionsregeln härleda den tomma klausulen. Vad som skulle behövas vore ytterligare en regel (en s.k. substitutionsregel) som låter oss härleda 4. P (b) 14
ur (1) och (2) eller 5. P (a) ur (2) och (3). Herbrand-metoder som bygger på grundresolution är fortfarande mycket ineffektiva, eftersom de kräver att vi genererar (och lagrar!) Herbrand-instanser av klausuler. Även för måttligt komplicerade satser är tids- och minnesåtgången på tok för stor för att metoden skall vara praktiskt användbar. Naturligtvis är det också en smula egendomligt att först generera instansieringar för att sedan stryka dem igen (med resolutionsregeln). Ett stort steg mot en praktiskt implementerbar logikprogrammeringsteori togs därför när Robinson, byggande på bl a idéer och resultat av den svenske logikern Dag Prawitz, introducerade allmän resolution. Denna form av resolution gör det möjligt att hoppa över instansieringssteget genom att utnyttja unifiering. 7 Unifiering En variabelersättare är ett par v t av en variabel v och en term t v. (Pilen kan läsas ut byts mot eller ersätts av.) En substitutionsmängd är en ändlig mängd av variabelersättare {v 1 t 1,..., v n t n }, sådan att alla variablerna v 1,..., v n är olika. En substitutionsmängd kan uppfattas som en beskrivning av ett sätt att transformera uttryck (termer och formler) som innehåller variabler. Vi kan med andra ord uppfatta en substitutionsmängd som inducerande en syntaktisk funktion definierad för godtyckliga uttryck i enlighet med följande definition: En substitution θ är en syntaktisk funktion som svarar en-en-tydigt mot en substitutionsmängd {v 1 t 1,..., v n t n } och vars värde för ett uttryck E är resultatet av att i E ersätta varje förekomst av variabeln v k med en förekomst av termen t k (för alla k = 1,..., n samtidigt). Resultatet av ett applicera substitutionen θ på uttrycket E betecknas Eθ (eller ibland (E)θ för tydlighets skull), och kallas en instans av E (via θ). (Ibland t.o.m. för en substitutionsinstans av E (via θ) eller en θ-instans av E. Mot {x b, y x} svarar en funktion θ sådan att (t.ex.) P (x, y, f(a))θ = 15
P (b, x, f(a)) och Q(f(x), g(x, y))θ = Q(f(b), g(b, x)) Kommentarer: Av det ovanstående framgår det att en substitution lämnar alla utom ändligt många variabler fixa, eftersom substitutioner svarar en-en-tydigt mot ändliga mängder av variabelersättare. Mot en substitution θ svarar närmare bestämt substitutionsmängden {x xθ : x är en variabel och x xθ}. Identitetsfunktionen (Id) på mängden av uttryck kan betraktas som en substitution sådan att (E)Id = E för alla uttryck E. Den svarar således mot den tomma substitutionsmängden. Eftersom substitutioner och substitutionsmängder svarar en-en-tydigt mot varandra brukar man identifiera dem, och skriver t.ex. Id =. Vi kommer ibland att ansluta oss till denna praxis i det följande, om det av kontexten är klart vad som avses. Sammansättningen av två substitutioner θ och τ är en substitution som betecknas θτ (eller ibland för tydlighets skull (θτ)), och som definieras av villkoret: E(θτ) = (Eθ)τ för alla uttryck E Med andra ord är resultatet av att applicera funktionen θτ på uttrycket E identiskt med resultatet av att applicera τ på resultatet av att applicera θ på E. Låt θ vara den substitution som svarar mot {x f(y), y z}, och τ den som svarar mot {x a, y b, z y}, och låt E vara P (x, y, z, f(x), g(y), h(z)). Då är Eθ = P (f(y), z, z, f(f(y)), g(z), h(z)); (Eθ)τ = E(θτ) = P (f(b), y, y, f(f(b)), g(y), h(y)). Kommentar: I exemplet ovan ser man att Eθτ kunde erhållits i ett steg via den substitution som svarar mot {x f(b), z y}. Detta är ett specialfall av följande generella sats: Om θ svarar mot {v 1 t 1,..., v n t n } och om τ svarar mot {u 1 s 1,..., u m s m }, så svarar θτ mot unionen av mängderna {v i t i τ : v i v i τ, i = 1,..., n} och {u k s k : u k / {v 1,..., v n }, k = 1,..., m}. Två uttryck E 1 och E 2 sägs vara unifierbara om det finns en substitution θ sådan att E 1 θ = E 2 θ, och θ kallas i så fall en unifierare för E 1 och E 2. 16
En unifierare θ för E 1 och E 2 kallas en mest generell unifierare (mgu) för E 1 och E 2 om det till varje unifierare τ för E 1 och E 2 finns en substitution σ så att τ = θσ. P (f(x), z) och P (y, a) är unifierbara via θ = {y f(a), x a, z a}, ty P (f(x), z)θ = P (y, a)θ = P (f(a), a). θ är dock inte en mgu för uttrycken. En mgu är t.ex. {y f(x), z a} som ger den gemensamma instansen P (f(x), a). P (f(x), a) och P (y, f(z)) är inte unifierbara eftersom ingen substitution kan få andraargumenten att sammanfalla. Ett deluttryck E till ett uttryck E är en delsträng av E som själv är ett välformat uttryck (= formel eller term). P (f(x, a), h(y)) har följande deluttryck: P (f(x, a), h(y)), f(x, a), h(y), x, a, y (Ett uttryck är alltså alltid ett deluttryck till sig själv.) Om två uttryck E 1 och E 2 är olika, så finns det en (räknat från vänster) första plats där de skiljer sig åt. Låt E 1 och E 2 vara de deluttryck av E 1 resp. E 2 som börjar på denna plats i E 1 resp. E 2. Paret (E 1, E 2 ) kallas första skillnaden mellan E 1 och E 2. (För att detta skall vara ett väldefinierat begrepp måste vi räkna predikat- och funktionssymboler som olika om de har olika ställighet; jfr sista raden i exemplet nedan.) E 1 E 2 (E 1, E 2 ) P (f(a), g(x)) P (y, y) (f(a), y) Q(f(a), h(y), a) Q(f(x), z, b) (h(y), z) P (x, a) Q(x, a) (P (x, a), Q(x, a)) Q(x, y, z) Q(x, y) (Q(x, y, z), Q(x, y)) Vi skall nu presentera en algoritm som till två uttryck E 1 och E 2 konstruerar en mgu om de är unifierbara, och meddelar att de ej är unifierbara annars. Unifieringsalgoritm: Sätt k = 0 och θ 0 = Id och gå till (1) 1. Om E 1 θ k = E 2 θ k : stanna; θ k är en mgu. Annars: ta reda på första skillnaden D k mellan E 1 θ k och E 2 θ k och gå till (2) 2. Om D k = (v, t) där t är en term och v är en variabel som inte förekommer i t: sätt θ k+1 = θ k τ, där τ = {v t}, öka k med 1 och gå till (1) 17
Annars: stanna; E 1 och E 2 är ej unifierbara. E 1 = P (f(a), g(x)), E 2 = P (y, y) θ 0 = Id D 0 = (f(a), y) τ = {y f(a)} = θ 1, E 1 θ 1 = P (f(a), g(x)) E 2 θ 1 = P (f(a), f(a)) D 1 = (g(x), f(a)) E 1 och E 2 är ej unifierbara. E 1 = P (a, x, h(g(z))), E 2 = P (z, h(y), h(y)) θ 0 = Id D 0 = (a, z) τ = {z a} = θ 1, E 1 θ 1 = P (a, x, h(g(a))) E 2 θ 1 = P (a, h(y), h(y)) D 1 = (x, h(y)) τ = {x h(y)}, θ 2 = θ 1 τ = {z a, x h(y)} E 1 θ 2 = P (a, h(y), h(g(a))) E 2 θ 2 = P (a, h(y), h(y)) D 2 = (y, g(a)) τ = {y g(a)}, θ 3 = θ 2 τ = {z a, x h(g(a)), y g(a)} E 1 θ 3 = E 2 θ 3 = P (a, h(g(a)), h(g(a))) Alltså är E 1 och E 2 unifierbara, och θ 3 är en mgu. E 1 = P (x, x), E 2 = P (y, f(y)) θ 0 = Id D 0 = (x, y) τ = {x y} = θ 1, E 1 θ 1 = P (y, y) E 2 θ 1 = P (y, f(y)) D 1 = (y, f(y)) Eftersom y förekommer i f(y) är E 1 och E 2 ej unifierbara. Huvudresultatet i detta avsnitt är följande: Om två uttryck är unifierbara så har de en mgu, och unifieringsalgoritmen ger en sådan i ändligt många steg. Om två uttryck inte är unifierbara meddelar unifieringsalgoritmen detta efter ändligt många steg. Kommentar: Den unifieringsalgoritm som presenterats ovan är inte speciellt effektiv. Huvudskälet till detta är förekomsten av villkoret utmärkt med fetstil i steg (2). Detta villkor (s.k. förekomstkontroll eller occur-check ) kan leda till att algoritmens beräkningstid blir en exponentiell funktion av uttryckens längd. I många PROLOG- 18
versioner har man därför helt enkelt utelämnat villkoret (förekomstkontrollen) i den implementerade unifieringsalgoritmen, vilket i sin tur leder till att dessa PROLOG-versioner kan ge felaktiga svar på frågor. Mer om detta senare. 8 Allmän resolution Den allmänna resolutionsregeln lyder: Givet två klausuler C 1 och C 2 utan gemensamma variabler som innehåller en positiv literal P resp. en negativ literal N = L sådana att det finns en substitution θ som unifierar P och L (dvs P θ = Lθ), bilda en ny klausul C 3 (kallad resolventen av C 1 och C 2 under θ) genom att stryka alla förekonister av P och N i C 1 och C 2, bilda disjunktionen av alla θ-instanser av literaler i C 1 och C 2, och eliminera eventuella dubbla förekomster av literaler. Huvudresultatet för allmän resolution lyder: En mängd av klausuler är osatisfierbar omm den tomma klausulen kan härledas ur mängden med hjälp av den allmänna resolutionsregeln (och sådana variabelbyten som krävs för att göra regeln tillämpbar). Vi skall i det följande bara behandla det specialfall av regeln som rör körning av logikprogram, dvs fall där vi har en ändlig mängd av programklausuler och en målklausul, och där vi i varje tillämpning av regeln härleder en (ny) målklausul. Detta specialfall kallas (allmän) top-down resolution. Regeln kan då ges följande formulering: Om A B 1,..., B n och C 1,..., C k,..., C m är två klausuler utan gemensamma variabler, och A och C k (k {1,..., m}) har en mgu θ, så får man dra slutsatsen C 1 θ,..., B 1 θ,..., B n θ,..., C m θ. Låt P vara ett logikprogram som består av följande klausuler: (P1) F (x 1, y 1 ) Q(x 1, y 1 ) (P2) R(x 2, y 2 ) F (x 2, z 2 ), F (y 2, z 2 ) (P3) Q(b, c) (P4) Q(a, c) 19
Vi skall undersöka om xr(a, x) är en konsekvens av P, och om så är fallet få ett exempel på en individ som a står i relationen R till. Vi lägger därför till målklausulen: (M5) R(a, x 5 ) till programmet och försöker härleda den tomma klausulen med allmän top-down resolution. (M5) R(a, x 5 ) (P2) R(x 2, y 2 ) F (x 2, z 2 ), F (y 2, z 2 ) ger via θ 1 = {x 2 a, y 2 x 5 } (M6) F (a, z 2 ), F (x 5, z 2 ) som tillsammans med (P1) F (x 1, y 1 ) Q(x 1, y 1 ) ger via θ 2 = {x 1 a, y 1 z 2 } (M7) Q(a, z 2 ), F (x 5, z 2 ) som tillsammans med (P4) Q(a, c) ger via θ 3 = {z 2 c} (M8) F (x 5, c) som tillsammans med (P1) F (x 1, y 1 ) Q(x 1, y 1 ) ger via θ 4 = {x 1 x 5, y 1 c} (M9) Q(x 5, c) som tillsammans med (P3) Q(b, c) ger via θ 5 = {x 5 b} (M10) dvs en motsägelse. Vi har alltså med resolution visat att P { R(a, x 5 )} är osatisfierbar (eller inkonsistent). Genom att följa med i de substitutioner som gjorts under härledningens gång kan vi också se att R(a, b) är en konsekvens av programmet P. (Variabeln x 5 följer med ända till sista steget, där den byts mot b via θ 5.) Näst sista steget i härledningen kunde istället sett ut på följande sätt: (M9) Q(x 5, c) (P4) Q(a, c) som via θ 5 = {x 5 a} ger (M10 ) vilket visar att också R(a, a) är en konsekvens av P. De två lösningarna x 5 = b och x 5 = a är dock de enda. 20
9 En indeterministisk bevisalgoritm Vi kan nu sammanställa metoderna i de två föregående avsnitten till en bevismetod som är sund och fullständig. Vi gör detta i form av en algoritm för att härleda den tomma klausulen ur ett logikprogram och en målklausul med allmän top-down resolution. Ingångsvärden ar ett logikprogram P, en målklausul G och en tom lista S (av substitutioner). 1. Genomför (om det behövs) lämpliga substitutioner på programklausuler, så att ingen variabel förekommer i mer än en klausul i P {G} 2. Välj en literal L i målklausulens kropp om detta går; annars: stanna, målklausulen är tom och härledningen har lyckats 3. Välj en programklausul vars huvud L har samma predikat som L om detta går; annars: stanna, härledningen har misslyckats 4. Beräkna med unifieringsalgoritmen en mgu θ till L och L om detta går; annars gå till (3) 5. Utför ett resolutionssteg med L, L och θ, lägg θ sist i S, sätt resolventen som nytt G och gå till (1) Varje lyckad härledning enligt algoritmen resulterar i en lista S av substitutioner som kallas härledningens substitutionshistoria. Genom att bilda sammansättningen av alla substitutionerna i S (i den ordning de förekommer i S) får vi en substitution θs som kallas en härledd svarssubstitution för P {G}. (Om S är tom sätter vi θs = Id, och om S bara har ett element är θs lika med detta element.) För att exakt formulera sundhets- och fullständighetssatserna för metoden behöver vi ännu några begrepp: Låt φ vara en formel vars alla fria variabler är v 1,..., v n. Det universella höljet av φ är satsen v 1... v n φ. Låt P vara ett logikprogram och G = A 1,..., A n en målklausul. En substitution θ är en korrekt svarssubstitution för P {G} omm universella höljet av (A 1... A n )θ är en logisk konsekvens av P. Bevisalgoritmen har följande egenskaper: Sundhet: 21
1. Om den tomma klausulen kan härledas ur P {G} så är P {G} osatisfierbar 2. Om θs är en härledd svarssubstitution för P {G} så är θs en korrekt svarssubstitution för P {G}. Fullständighet: 1. Om P {G} är osatisfierbar så kan den tomma klausulen härledas ur P {G} 2. Om θ är en korrekt svarssubstitution för P {G} så finns en härledd substituton θs och en substitution τ så att θ = θsτ Kommentar: Att inte alla korrekta svarssubstitutioner fås direkt som härledda substitutioner beror på att vi med unifieringsalgoritmen varje gång beräknar en mgu (snarare än bara en godtycklig unifierare) och en härledd svarssubstitution är därför alltid så generell som möjligt för den väg att härleda den tomma klausulen som valts. Låt t.ex. P vara ett program i vilket individkonstanten a och funktionssymbolen f förekommer, och antag att H(x) är definitionen av predikatet H i P (dvs H förekommer inte i huvudet på någon annan programklausul i P ). Ställer vi frågan H(x) till programmet genererar bevisalgoritrnen bara en svarssubstitution θ sådan att Id = θτ, (dvs θ byter på sin höjd några variabler mot andra variabler), trots att H(a), H(f(a)), H(f(f(a))),... är konsekvenser av P. Motsvarande korrekta svarssubstitutioner {x a}, {x f(a)},... etc erhålls dock lätt ur θ med hjälp av lämpliga sammansättningar. 22