Föreläsning 16 Logik med tillämpningar
Innehåll u Information kring kursvärdering och tentagenomgång u Genomgång av övningstenta 2
Kursvärdering och tentagenomgång u Kursvärdering öppnas torsdag 21/3 –Sammanfattning på webben u Lösningsförslag på webben u Tentamensresultat via mail u Tentagenomgång –ska vi ha det? –när? (Tis 2/4 enda vettiga alternativet…)
Övningstentan u Gavs av mig – omtenta på DV-prog. u Täcker samma material som kommande tentamen. u Maxpoäng 40p (3, 4, 5 på 20, 26 respektive 32p) u Är en ”normalsvår” tenta.
Uppgift 1 u Redovisa stegen i algoritmen inte bara svaret. u Förklara vad du gör i varje steg med några ord. –Kan dock göra flera likadana omskrivningar i varje steg. Exempelvis flytta in alla negationer på en gång. u Visa tydligt vad i ditt svar som är slutsatsen. –Dvs vilken formel du anser vara ditt svar –(Läs noga är det PCNF eller klausulmängd som efterfrågas?) u Använd gärna olika parenteser för att visa vad som hör ihop med vad. {[()]} u Svar: {p(x 1 ) q(x 1,f(x 1 )) q(x 1, g(x 1 )), p(x 2 ) q(x 2,f(x 2 )) r(g(x 2 ), z 2 )}
Döp om variabler x(p(x) { y q(x, y) v[q(x, v) z r(v, z)]}) Ta bort konnektiv utom , och x(p(x) { y q(x, y) v[q(x, v) z r(v, z)]}) Flytta in negationer x(p(x) { y q(x, y) v[q(x, v) z r(v, z)]}) Flytta ut kvantifierare x y v z (p(x) { q(x, y) [q(x, v) r(v, z)]}) Gör om matrisen till CNF x y v z (p(x) {[ q(x, y) q(x, v)] [ q(x, y) r(v, z)]}) x y v z ([p(x) q(x, y) q(x, v)] [p(x) q(x, y) r(v, z)]) Skolemisera x v z ([p(x) q(x, f(x)) q(x, v)] [p(x) q(x, f(x)) r(v, z)]) x z((p(x) q(x,f(x)) q(x, g(x))) (p(x) q(x,f(x)) r(g(x), z))) Mängden: {p(x 1 ) q(x 1,f(x 1 )) q(x 1, g(x 1 )), p(x 2 ) q(x 2,f(x 2 )) r(g(x 2 ), z 2 )}
Uppgift 2 u Måste förklara hur och varför roten i tablån ser ut som den gör. Varför negera? u Måste dra en slutsats från trädet, kan inte bara visa trädet. Det är inte ett svar. u Om tablån för negationen av formeln är öppen måste en ny tablå göras. u Inga förenklingar av formeln får göras varken före, under eller efter man applicerar algoritmen. u Svar: Formeln valid
Formeln är valid eftersom negationen är en motsägelse.
Uppgift 3 u Var noga att kolla vad ni ska göra och att svara på alla deluppgifter. E = p(x, y) q(f(x), z) r(v, u) = { x f(y), y f(a), z u} = { y g(a), u z, v f(f(a))} u E = p(f(y),f(a)) q(f(f(y)), u) r(v,u) u E = p(x, g(a)) q(f(x), z) r(f(f(a)), z) u E = p(f(g(a)),f(a)) q(f(f(g(a))), z) r(f(f(a)),z) u = { x f(g(a)), y f(a), u z, v f(f(a))}
Uppgift 4 u För att veta om den fungerar så gör man en sanningstabell för uttrycket u Uttrycket blev inte lika som output. Alltså fungerar inte kretskortet som etiketten säger. För att få en formel kan man ta de rader där output är T.
u Vi får då: (p q r) (p q r) ( p q r) u den kan förenklas (alla formler från och med ovanstående är OK som svar, man behöver inte förenkla…) u (p r) (q q) ( p q r) (p r) ( p q r) (p ( p q)) r (p p) (p q) r (p q) r
Uppgift 5a) M = 2M = 3N = 3; N = 6; N = 9; no N = 2; N = 3;
5b) SVAREN blir N = 3; no
Uppgift 6 u Skriv vad du tänker, det kan i princip aldrig bli för mycket text… Antag att U är en mängd satslogiska formler, dvs U = {A 1, A 2,..., A n }, antag dessutom att A och B också är satslogiska formler. Visa att om U {A} |= B så gäller att U |= A B.
Svar Om U {A} |= B så innebär det att för alla tolkningar v så att v(U {A} ) = T så är v(B) = T Om v(U {A} ) = T så är v(U) = T och v(A) = T. Enda tillfället då U |= A B inte gäller är om det finns en tolkning v så att v(U) =v(A) =T och v(B) = F. Men om v(U) =v(A) =T så är v(U {A} ) = T och då vet vi att v(B) = T. Alltså gäller påståendet.
Uppgift 7 u Kom ihåg att om det står omm måste man bevisa ”åt båda hållen”. u Svar –Antag att S' satisfierbar då finns en modell v så att v(C) = T för alla klausuler C i S'. Lägg till i tolkningen att v(l) = T. Då blir v(C) = T för alla klausuler C i mängden S- S'. –Om S satisfierbar så är S' satisfierbar eftersom S' är en delmängd av S.
Uppgift 8 Ett exempel på lösning är: % everynth(N, L1, L2) % Tar var N:te element ur listan L1 % och returnerar det i L2... everynth(_, [], []). everynth(N, Xs, Ys) :- everynth(N, 1, Xs, Ys).
everynth(_, _, [], []). everynth(N, M, [X | Xs], [X | Ys]):- A is M mod N, A == 0, M1 is M + 1, everynth(N, M1, Xs, Ys). everynth(N, M, [X |Xs], Ys) :- A is M mod N, A \== 0, M1 is M + 1, everynth(N, M1, Xs, Ys).
Vilka lösningar ger ditt program på frågan everynth(3, X, [1, 2]) ? X = [_A,_B,1,_C,_D,2] ? ; X = [_A,_B,1,_C,_D,2,_E] ? ; X = [_A,_B,1,_C,_D,2,_E,_F] ? ; No Där _A till _F är namn på anonyma variabler
Uppgift 9 u Läs uppgiften noga, kan finnas flera frågor i en fråga. u Kortfattade svar: a) En algoritm är en beslutsprocedur om den terminerar och ger svaret 'yes' om formeln A tillhör U och 'no' om den ej tillhör U. b) Negera formeln och om den är osatisfierbar så är den falsk i alla tolkningar. Om v( A) = F i alla tolkningar så är v(A) = T i alla tolkningar dvs A är valid.
Uppgift 9 c) Om X förekommer flera gånger i listan kommer programmet att lyckas flera gånger. Detta kan undvikas antingen genom att skriva om programmet member(X, [X |Xs]). member(X, [Y|Xs]) :- X \== Y, member(X, Xs). eller genom att lägga till ett rött cut member(X, [X |Xs]):- !. member(X, [Y|Xs]) :- member(X, Xs). Det går att argumentera för båda varianterna. Huvudargument alt.1 är att det fortfarande är ett logiskt korrekt program. Den andra varianten är mer effektiv med avseende på exekveringshastigheten.
Uppgift 10 u Det finns tre typer av studenter: vanliga, exjobbare och forskarstudenter. x(fostud (x) vanlig(x) exjobbare(x)) u Studenter är inte forskarstudenter om det finns studenter som läst mer än dem. x y(läst_mer(x, y) fostud (y)) u De studenter som läst mer än andra studenter är inte vanliga studenter. x y(läst_mer(x, y) vanlig(x))
Uppgift 10 u Studenter är inte exjobbare om det finns andra studenter som läst mer och som är exjobbare. x y(läst_mer(x, y) exjobbare(x) exjobbare(y)) u Jane har läst mer än Jill som i sin tur har läst mer än Mary läst_mer(Jane,Jill) läst_mer(Jill,Mary) u Sedan vet vi också att egenskapen ”läst mer” är transitiv, dvs att följande förhållande gäller: x y z(läst_mer(x,y) läst_mer(y,z) läst_mer(x,z))
b) 1. läst_mer(x1,y1) fostud (y1) 2. läst_mer(x2,y2) vanlig(x2) 3. fostud (x3) vanlig(x3) exjobbare(x3) 4. läst_mer(x4,y4) läst_mer(y4,z4) läst_mer(x4,z4) 5. läst_mer(x5,y5) exjobbare(x5) exjobbare(y5) 6. läst_mer(Jane,Jill) 7. läst_mer(Jill,Mary)
c) 8. exjobbare(Jane) 9. läst_mer(Jane,y5) exjobbare(y5){x5 Jane} 5 o exjobbare(Jill){y5 Jill} 6 o fostud (Jill) vanlig(Jill){x3 Jill} 3 o läst_mer(x1,Jill) vanlig(Jill) {y1 Jill} 1 o läst_mer(x1,Jill) läst_mer(Jill, y2){x2 Jill} 2 o läst_mer(Jill, y2){x1 Jane} 6 o []{y2 Mary} 7 o 14