Lambdakalkylen ger också en beskrivning av begreppen beräkning och beräkningsordning.
Grundläggande i lambdakalkylen är tre regler för förenkling/beräkning, alfa, beta och eta-reglerna. Med vissa val av representationer, om alla objekt, även de naturliga talen, avbildas på funktioner, kan alla beräknningar utföras med dessa tre regler.
Skriv en funktion som reducerar ett lambdauttryck så långt det går. Avbilda de naturliga talen på lambda-uttryck och räkna ut uttryck såsom 1+1=2 i denna representation.
Petersson, Beräknebarhet för dataloger, Aquila
Barklund, Kursmaterial för Program och Maskinsemantik, utdrag
Gamla föreläsningsanteckningar, vissa böcker i utdrag i kursbiblioteket
Allt som kan sägas i "vanlig predikatlogik" kan alltså också sägas i Prolog. Vissa predikatlogiska formler måste emellertid skrivas om innan de blir exekverbara såsom Prologprogram.
Studera följande lilla Prologprogram.
universitetslarare(X) :- trevlig(X). universitetslarare(X) :- tokig(X). trevlig(roger). trevlig(lars). trevlig(jan). tokig(anders). vis(lars). studierektor(X) :- universitetslarare(X), vis(X).Programmets sista rad kan läsas som:
För alla X gäller, att X är studierektor om X är universitetslärare och X är vis.
eller
Om någon X är vis och detta X är universitetslärare, så är detta X studierektor.
Raderna i prologprammen är implicit allkvantifierade. Raderna läses alltså som om det stode en allkvantor (") följt av radens variabler först på raden. Symbolen :- motsvarar u, kommatecken motsvarar &.
Man kan se ett Prologprogram som en databas, mot vilken man kan ställa frågor. Prologintepretatorn härleder svaren på de ställda frågorna.
Exempel.
universitetslarare(anders)? yes universitetslarare(batman)? no tokig(X)? X är en variabel, tolkningen här är "Vilket X, dvs vem, är tokig?" X = anders
Prolog-program kan ge mnga svar, ty en relation är en många-till-många-mappning:
universitetslarare(X)? X=christer more X=tina more? X=janne more? X=anders more? noFör att göra detta visar Prologinterpretatorn med hjälp av resolution (en logisk härledningsmetod) att vi från programmet (en mängd av satser) kan härleda en sats (den fråga vi ställde till programmet), samt för vilka objekt detta gäller.
Prologprogram har ingen given beräkningsriktning i den bemärkelse att ingen parameter är bestämd som "in-" respektive "ut-"parameter. Prologprogram kan således "räkna baklänges".
Studera nedanstående exempel:
larare_till(platon,sokrates). Lärare till Platon är Sokrates larare_till(aristoteles,platon). larjunge_till(X,Y):-larare_till(Y,X). Lärjunge till X är Y om Y är lärare till X.med frågorna och svaren:
larare_till(platon,A)? A=sokrates larare_till(A,platon)? A=aristoteles larjunge_till(A,platon)? A=sokrates larjunge_till(A,B)? A=sokrates B=platon more? A=platon B=aristoteles more? no
Hitta ett sätt för de sex personerna att korsa floden lugna.
Idé 1: Ett av flera sätt att lösa uppgiften är att definiera ett
predikat
Idé 2: Du kan finna följande idé användbar (den kommer nog att förenkla det slutgiltiga programmet) . Definiera ett icke-deterministiskt predikat plus(X,Y,Z), som givet ett eller två parametervärden, beräknar det eller de saknande värdena. Om du representerar de naturliga talen med efterfäljarefunktionen s, så att 0,1,2,3.... skrivs 0, s(0), s(s(0)), s(s(s(0)))....blir predikatet lätt att definiera. En sådan representation av de naturliga talen är godtagbar i din lösning.
Kommentar: Vi antar , på klassiskt utbildningsmaner, att uppgiften innehåller all information om problemet. Således finns inga vadställen, inga helikoptrar eller broar tillgängliga, ej heller kan missionärerna påverka kannibalerna att ändra sina antagna vanor. Ett intressant fält inom AI-forskning idag är studier av de situationer där den här typen av förenklingar inte kan göras, dvs där man vill modellera en verklig (eller åtminstone verkligare) situation. Hur formaliserar man lämpligt otillräcklig eller motsägelsefull kunskap? Vilka metoder för slutsatsdragning är tillämpliga?
Du behöver inte bekymra dej huruvida ditt program verkligen ger alla lösningar interaktivt (men den måste ge minst några lösningar), eller om samma lösning kan förekomma två gånger, om du söker alla lösningar.
Ett par exempel kan illustrera den mycket kompakta programkoden. Om du läser denna "som matematik" och inte "som data", är den lättförståelig.
Exempel 1
[n * n | n <- [0 ..]] en lista av kvadraten av alla heltal från 0
Exempel 2
[r | r <- [1 .. n div 2]; n mod r = 0] en lista av faktoriseringen av n, ty r är varje tal mellan 1 och n/2 och n modulo r är noll
Exempel 3
quicksort[]=[] quicksort(x:xs) = quicksort[y | y <- xs; y<x] ++[x] ++ quicksort[z | z <- xs; z>=x]Läs så här:
En del tips finns.
1, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, ....Primtalen kommer "ibland" parvis
<3,5>, <5,7>, <11,13>, <17,19>, <29,31> ...Skriv en funktion som genererar denna (möjligtvis?) oändligt långa lista av tal. Ditt program ska använda algoritmen Erathosetenes såll, som återfinns i läroböcker i algebra. Programmet ska på ett meningsfullt sätt använda sig av lat evaluering.
DEF Subset AS distl | EACH member END | and;
Läs ungefär så här i ett exempel "anrop" exempel:
show
<<4,2,5,1,3> <1,2,3>> : Subset
Distribuera den ena listans element över den andra:
<<<4,2,5,1,3>,1 > <<4,2,5,1,3>2,> <<4,2,5,1,3>3,>> : EACH member END | and
Applicera medlem på varje på så sätt producerat par <lista, element>:
< T, T, T> : and
Applicera and
på alla element i den skapade listan:
T
En del tips finns.
Båda i kursbiblioteket.
Du bör under din lektion välja att hålla dig till en syntax, exvis IFP, men du ska även prata om grundläggande idéer, exvis från Bacchus artikel.
Simulatorn skall vara distribuerad på minst två olika maskiner.
Exempel
Användarsnittet i en Lisp-interpretator kan beskrivas så här
(do forever (print (eval (read))))där eval tar en programspråkskonstruktion i Lisp och returnerar värdet av denna. Idé om hur eval kan se ut
(defun eval (e env) (cond ((isconst e) (denote e) ((isvar e) (lookup e env)) ((iscond e) (evcond (arg e) env)) ((isquote e) (dequote e)) ((isfunc+arg e) (apply (func e) (evalarg (arglist e) env) env))))där
apply applicerar en funktion på utvärderade argument
evalarg utvärderar argument
eller
eller
Darlington m.fl., Functional Programming and its Applications, kap "Interpreters for Functional Languages", s 253. Boken kan lånas för kopiering.
Anders Berglund Office: Room 1254 Department of Computer Systems E-mail: Anders.Berglund@docs.uu.se Box 325 Phone (work): +46 18 471 31 67 S-751 05 Uppsala Mobile phone: +46 70 582 45 80 Sweden Fax (work): +46 18 55 02 25 Senast ändrad: 09/21/98