Presentation laddar. Vänta.

Presentation laddar. Vänta.

Kenneth Wilhelmsson 1 Logikprogrammering 10 P Onsdag 20 november 2002.

Liknande presentationer


En presentation över ämnet: "Kenneth Wilhelmsson 1 Logikprogrammering 10 P Onsdag 20 november 2002."— Presentationens avskrift:

1 Kenneth Wilhelmsson [kw@ling.gu.se] 1 Logikprogrammering 10 P Onsdag 20 november 2002

2 Kenneth Wilhelmsson [kw@ling.gu.se] 2 Logikprogrammering 10 P: 20 november 2002 Idag: Filer, strömmar m m

3 Kenneth Wilhelmsson [kw@ling.gu.se] 3 Repetition Moduler + något nytt En av tenta-uppgifterna Och filhantering fram till dagens egentliga ämne

4 Kenneth Wilhelmsson [kw@ling.gu.se] 4 Moduler i SICStus Prolog När man använder moduler i Prolog innebär det att predikat som man vill använda kan hämtas från andra filer. Förmodligen är några av Prologs tilläggspredikat bekanta. T ex de som finns i resursmodulen lists.pl m fl.

5 Kenneth Wilhelmsson [kw@ling.gu.se] 5

6 6 Hur göra modul? Genom att först i sin prolog-fil (t ex min_fil.pl) skriva följande, definierar man en modul innehållande en delmängd av (alt: samtliga) ingående predikat. :- module(min_fil, [pred1/4, pred5/2, pred2/2]). [programkod…] (Predikaten som finns i listan finns med längre ner i filen)

7 Kenneth Wilhelmsson [kw@ling.gu.se] 7 Anrop från en modul till en annan :- module(min_fil, [pred1/4, pred5/2, pred2/2]). [programkod…] :- module(andra_filen,[bepa/7]). use_module(min_fil, [pred1/4, pred2/2]). … - Notera att hela modulen ej importeras här.

8 Kenneth Wilhelmsson [kw@ling.gu.se] 8 Placering av module och use_module module-deklarationen (om sådan finns) skall placeras allra först i filen. Modulnamnet är detsamma som prologfilnamnet, dock utan ”.pl”. use_module-deklarationerna (om sådan finns) skall komma härnäst. Dessa beskriver alltså vilka predikat som importeras till denna modul.

9 Kenneth Wilhelmsson [kw@ling.gu.se] 9 Om vi inte nämner att vi vill importera ett visst predikat till en modul… Om vi anropar somliga predikat från en fil mha use_module, men inte alla – så behöver inte nya definitioner av den importerade filens samtliga predikat innebära några som helst bekymmer.

10 Kenneth Wilhelmsson [kw@ling.gu.se] 10 Tentauppgift 3a

11 Kenneth Wilhelmsson [kw@ling.gu.se] 11 Vad kommer att hända när u1.pl laddas in?

12 Kenneth Wilhelmsson [kw@ling.gu.se] 12 Svar: Vi får NAME CLASH tre gånger I SICSTUS Prolog betyder det att vi får välja om vi vill byta definition av de drabbade predikaten.

13 Kenneth Wilhelmsson [kw@ling.gu.se] 13 ”Stor fördel” När vi skriver :-use_module kan vi naturligtvis avstå från att hämta samtliga predikat från en modul. Om vi inte uttryckligen hämtar ett predikat kan vi definiera detta på annat vis i filen utan att råka ut för name clash.

14 Kenneth Wilhelmsson [kw@ling.gu.se] 14 Ett annat sätt att anropa ett predikat från godtycklig fil kan vara att använda sig av ’:’. Denna funktionalitet finns i första hand för felsökningssyften. Exempel:

15 Kenneth Wilhelmsson [kw@ling.gu.se] 15

16 Kenneth Wilhelmsson [kw@ling.gu.se] 16 Disjunktioner i Prolog Hur uttrycker vi disjunktion (eller) i Prolog? kan_prolog(Person):- datalingvist(Person). kan_prolog(Person):- kognitionsvetare(Person). kan_prolog(Person):- gått_prologkurs(Person). Fråga: använder ovanstående definition en inklusiv eller exklusiv definition av eller om vi säger att predikaten motsvarar ”de verkliga betydelserna?” (OR eller XOR?)

17 Kenneth Wilhelmsson [kw@ling.gu.se] 17 Ett annat sätt att uttrycka disjunktion som kan spara plats: kan_prolog(Person):- (datalingvist(Person) ; kognitionsvetare(Person) ; gått_prologkurs(Person)). (jfr med ”|”-notation i PSG”) Predikatet är ekvivalent med det föregående. (Kompilatorn genererar samma optimaliserade kod för båda varianterna av skrivsätt.)

18 Kenneth Wilhelmsson [kw@ling.gu.se] 18 Tentauppgift 3a

19 Kenneth Wilhelmsson [kw@ling.gu.se] 19 Några Prolog-tips (direkt från SICStus-manualen) -Skriv inte predikat om de redan finns bland de fördefinierade. -Inled rekursiva regler med basfall. -Skriv input-argumenten före output-argumenten i regelhuvuden. -Var gärna sparsam med användningen av cut. -När disjunktion skrivs mha semikolon – avsluta ej raden med semikolonet. Och helst inom parenteser.

20 Kenneth Wilhelmsson [kw@ling.gu.se] 20 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).

21 Kenneth Wilhelmsson [kw@ling.gu.se] 21 ”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”

22 Kenneth Wilhelmsson [kw@ling.gu.se] 22 Ej repetition: Alla predikat: Det går naturligtvis att läsa in samtliga predikat från en modul där de gjorts tillgängliga. Skriv enbart modulnamnet i :-use_module(filnamn). För att göra predikat tillgängliga från modulen mha module() krävs dock att att alla predikat anges. Minns list.pl.

23 Kenneth Wilhelmsson [kw@ling.gu.se] 23 See/1 för att öppna en fil: see/1 förändrar indataströmmen fullständigt - från tangentbordet till en angiven fil (argumentet) härefter: get_line/1

24 Kenneth Wilhelmsson [kw@ling.gu.se] 24 Motsvarigheten till see/1 heter tell/1 för att skriva till filer Observera att det gamla textinnehållet raderas och ersätts av vad som anges när tell används. tell(’viktig_fil.txt’). write(’adjö’), nl. told.

25 Kenneth Wilhelmsson [kw@ling.gu.se] 25 Dagens ämne: En nackdel med tell är att detta predikat – inte möjliggör konkatenering till en fil! tell/1 förstör den gamla filen och ersätter innehållet med något nytt. (Den gamla filen förstörs alltså i det fall den existerar.)

26 Kenneth Wilhelmsson [kw@ling.gu.se] 26 Tell En annan nackdel med detta predikat är att man kanske vill skriva till två filer samtidigt. Eller kanske till en fil och samtidigt till skärmen. See är inte bättre i detta avseende – hur skulle man kunna läsa från två olika filer samtidigt. (Man behöver ju öppna och stänga hela tiden.)

27 Kenneth Wilhelmsson [kw@ling.gu.se] 27 Vad som krävs: strömmar och predikat för dessa Mha av predikatet open/3 öppnar man en ström för en viss fil. En ström är en identifierare för en öppnad fil.

28 Kenneth Wilhelmsson [kw@ling.gu.se] 28 Open/3 open/3 har tre olika användningssätt – read, write och append.

29 Kenneth Wilhelmsson [kw@ling.gu.se] 29 Öppna och skriva open(hejsan, write, Ström).

30 Kenneth Wilhelmsson [kw@ling.gu.se] 30 Öppna och skriva på ett mer utförligt sätt Det finns varianter av write, nl, read och get_char för användning i detta sammanhang: öppna_och_skriv:- open(hej,write, min_fil), nl(min_fil), write(min_fil, hå), nl(min_fil), close(min_fil).

31 Kenneth Wilhelmsson [kw@ling.gu.se] 31 KOPIERA EN FIL TILL EN ANNAN kopiera(Infil,Utfil):- open(Infil, read, Inström), open(Utfil,write, Utström), kopiera-strömmar(Inström,Utström), close(Inström), close(Utström). kopiera_strömmar(Inström, Utström) :- get_char(Inström, X), ( X=end_of_file -> true ; put_char(Utström, X), kopiera_strömmar(Inström, Utström) ).

32 Kenneth Wilhelmsson [kw@ling.gu.se] 32 Om exemplet Föregående exempel går lika bra att genomföra mha tell/told och see/seen

33 Kenneth Wilhelmsson [kw@ling.gu.se] 33 Standardströmmarna Det finns tre standardströmmar: En för inmatning, en för utmatning och en för felmeddelanden.

34 Kenneth Wilhelmsson [kw@ling.gu.se] 34 Standardströmmar Dessa är user_input, user_output och user_error ?- write(user_output, krater). krater ?- read(user_input,X). |: guldälg X = guldälg

35 Kenneth Wilhelmsson [kw@ling.gu.se] 35 Uppgift: Skriv ett predikat, vänd_lista/2 vars andra argument är den omvända varianten av listan som finns i första argumentet.

36 Kenneth Wilhelmsson [kw@ling.gu.se] 36 Lösningsförslag Naïve reverse reverse([],[]). reverse([X|Xs], Zs):- reverse(Xs,Ys), append(Ys,[X], Zs).

37 Kenneth Wilhelmsson [kw@ling.gu.se] 37 Ackumulerad reverse reverse(Xs,Ys):-reverse(Xs,[],Ys). reverse([X|Xs],Acc,Ys):- reverse(Xs, [X|Acc], Ys). reverse([],Ys,Ys).

38 Kenneth Wilhelmsson [kw@ling.gu.se] 38 Tack för idag


Ladda ner ppt "Kenneth Wilhelmsson 1 Logikprogrammering 10 P Onsdag 20 november 2002."

Liknande presentationer


Google-annonser