Föreläsning 12 i programmeringsparadigm. Negering.

Relevanta dokument
Föreläsning 11 i programmeringsparadigm. Negering.

Del : Funktionell programmering. I alla deluppgifterna, använd Haskell och skriv typen för de identifierare du definierar.

Kursanalys för Programmeringsparadigm 2D1361, läsperiod 1 och 2 läsåret 2005/2006

Föreläsning 9 i programmeringsparadigm. Paradigmöversikt, paradigmhistoria, paradigmgeografi. Se även föreläsning 1.

Del : Paradigmer allmänt.

Föreläsning 9 i programmeringsparadigm. Unifiering (Brna Chapter 4.1).

Del : Paradigmer allmänt.

DD1361 Programmeringsparadigm HT15

Föreläsning 8. newtype Chess = Chess [(Square, Chessman)] -- data ist f newtype OK -- data istället för newtype krävs om >1 konstruerare.

DD1361 Programmeringsparadigm HT15

DD1361 Programmeringsparadigm HT17

Nada Tentamensdag 2004 okt 18 Tentamen Programmeringsparadigm Skrivtid 5 h

Välkomna till DIT012 IPGO. Tyvärr en bug i Google Docs: Sidnummer stämmer inte alltid. Alla anteckningar börjar på sidan 1.

DVG C01 TENTAMEN I PROGRAMSPRÅK PROGRAMMING LANGUAGES EXAMINATION :15-13: 15

DD1361 Programmeringsparadigm HT15

Introduktion till Haskell

Nada KTH 2004 jan 12 Tentamen Programmeringsparadigm 2D1350 Skrivtid 5 h 8-13

Föreläsning 10 Datalogi 1 DA2001. Utskrift på skärmen. Syntax. print( Hej ) Hur är det? Hej. print( Hej,end= ) print( Hur är det? ) HejHur är det?

Tentamen. Datalogi I, grundkurs med Java 10p, 2D4112, Lördagen den 30 november 2002 kl , salar E33, E34

DD1361 Programmeringsparadigm HT16

Föreläsning [ ] i programmeringsparadigm. Om multiparadigm-språket OZ och en tjock bok.

1. Compute the following matrix: (2 p) 2. Compute the determinant of the following matrix: (2 p)

Föreläsning 2 Programmeringsteknik DD1310. Programmering. Programspråk

TENTAMEN I PROGRAMSPRÅK -- DVG C kl. 08:15-13:15

Föreläsning 2 Programmeringsteknik och C DD1316. Mikael Djurfeldt

Pre-Test 1: M0030M - Linear Algebra.

Traditionell Programmering

Några inbyggda funktioner (med resultat!) Introduktion till programmering D0009E. Föreläsning 4: Villkor och rekursion. Modulus-operatorn.

Nada KTH 2003 okt 23 Tentamen Programmeringsparadigm 2D1350 Skrivtid 5 h 8-13

Föreläsning 2 Programmeringsteknik och C DD1316. Programmering. Programspråk

DD1361 Programmeringsparadigm. Carina Edlund

Deklarativt programmeringsparadigm

Hur fattar samhället beslut när forskarna är oeniga?

OMTENTAMEN I PROGRAMSPRÅK -- DVG C kl. 08:15-13: 15

Centrala begrepp i prolog och logikprogrammering. Annamaris lista

Laboration: Whitebox- och blackboxtesting

Introduktion till programmering SMD180. Föreläsning 4: Villkor och rekursion

Föreläsning 2 Programmeringsteknik DD1310. Programmering. Programspråk

Introduktion till formella metoder Programmeringsmetodik 1. Inledning

Ett Logikprogram. Logik och Programmering. Introduktion till PROLOG, dvs. PROgramming in LOGic. Viktiga begrepp/områden i Prolog. Framtiden?

Support Manual HoistLocatel Electronic Locks

Användarhandledning Version 1.2

Programmering I Tobias Wrigstad fredag, 2009 augusti 28

Funktionell programmering DD1361

Imperativ programmering

Föreläsning 10 i programmeringsparadigm. Boxmodellen för append.

Grundläggande datalogi - Övning 1

LUNDS TEKNISKA HÖGSKOLA Institutionen för Elektro- och Informationsteknik

Att skriva till och läsa från terminalfönstret

Sammanfattning. Listor. List-manipulering. Matris. /home/lindahlm/activity-phd/teaching/11dd1310/exercise3/exercise3.py September 13, 20111

Prova på-laboration i Prolog

Föreläsning 5 i programmeringsparadigm.

Program & programmering

COMPUTABILITY BERÄKNINGSBARHET. Källa: Goldschlager, Lister: Computer Science A Modern Introduction 2. upplaga 1988, Prentice Hall

denna del en poäng. 1. (Dugga 1.1) och v = (a) Beräkna u (2u 2u v) om u = . (1p) och som är parallell

Webbregistrering pa kurs och termin

TDDC74 Lab 02 Listor, sammansatta strukturer

Tentamen i kurserna Beräkningsmodeller (TDA181/INN110) och Grundläggande Datalogi (TDA180)

FÖRBERED UNDERLAG FÖR BEDÖMNING SÅ HÄR

JavaScript del 3 If, Operatorer och Confirm

Senast. Idag. Icke-strikt evaluering. Strikt evaluering. Testa latheten! Lat evaluering. Plus och minus med lat evaluering. Testa latheten!

ITK:P1 Föreläsning 1. Programmering. Programmeringsspråket Java. Stark typning Explicit typning Strukturerat Hög säkerhet

Command line argumenter. Objektorienterad Programmering (TDDC77) Vad blir resultatet? Nu då? Ahmed Rezine. Hösttermin 2016

Objektorienterad Programmering (TDDC77)

Tentamen i. TDDA 69 Data och programstrukturer

Make a speech. How to make the perfect speech. söndag 6 oktober 13

GU / Chalmers Campus Lindholmen Tentamen Programutveckling LEU 482 / TIG167

Dagens föreläsning Programmering i Lisp Fö 7. Sammanfattning funktionell programmering Exempel på funktionella programspråk

Användning av datastrukturer Algoritmer och datastrukturer Obligatorisk Laboration nr 1

Dugga Datastrukturer (DAT036)

Del : Funktionell programmering. I alla deluppgifterna, använd Haskell och skriv typen för de identifierare du definierar.

Tentamensdag 2002-aug-20 Tentamen i Funktionell Programmering Skrivtid 5 h

Python. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python.

Tentamen i kurserna Beräkningsmodeller (TDA181/INN110) och Grundläggande Datalogi (TDA180)

Python. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python.

Föreläsning 8. Paradigmöversikt, paradigmhistoria, paradigmgeografi. Se även föreläsning 1.

Kap9. Operatorn.. Hudak 9.4 sid 11. Fermats förmodan, eller Fermats stora sats säger att. xm + ym == zm har heltalslösningar om och endast om m == 2.

Introduktion till programmering D0009E. Föreläsning 1: Programmets väg

Recap Mera om nya typer Kort Fält. Programmering. Sommarkurs Verónica Gaspes. IDE-sektionen.

Quick Start Guide Snabbguide

Webbreg öppen: 26/ /

Sätt att skriva ut binärträd

Deklarativ programmering

Kungliga Tekniska Högskolan Ämneskod 2D1370 Tentamensdag 2001-maj-31 Tentamen i Funktionell Programmering Skrivtid 4 h

Bakgrund och motivation. Definition av algoritmer Beskrivningssätt Algoritmanalys. Algoritmer. Lars Larsson VT Lars Larsson Algoritmer 1

Föreläsning Datastrukturer (DAT037)

LÖSNINGSFÖRSLAG TENTAMEN PROGRAMMERING I ETT FUNKTIONELLT SPRÅK ML, 5P

Information technology Open Document Format for Office Applications (OpenDocument) v1.0 (ISO/IEC 26300:2006, IDT) SWEDISH STANDARDS INSTITUTE

Deklarativ programmering

Isolda Purchase - EDI

1. Varje bevissteg ska motiveras formellt (informella bevis ger 0 poang)

Labb i Datorsystemteknik och programvaruteknik Programmering av kalkylator i Visual Basic

Objektsamlingar i Java

Föreläsning 9 Innehåll. Söndra och härska. Fibonaccitalen. Söndra och härska. Divide and conquer teknik för att konstruera rekursiva algoritmer.

Exempelsamling Assemblerprogrammering

Användning av datastrukturer Algoritmer och datastrukturer Obligatorisk Laboration nr 1

Föreläsning 3: Booleans, if, switch

Klassdeklaration. Metoddeklaration. Parameteröverföring

Föreläsning 2 Programmeringsteknik och C DD1316

TDDC74 Programmering: Abstraktion och modellering Dugga 2, , kl 17-19

Transkript:

Föreläsning 12 i programmeringsparadigm. Negering. Brna avsnitt 7.2. Prologs negering \+ fungerar som så att om vi har delmålet \+ p(...), så körs p(..). Om denna körnings lyckas så misslyckas \+ p(...)och tvärtom. Detta sätt att implementera negering i Prolog leder till en mängd konstigheter, speciellt om p(...) innehåller logiska variabler som vid körningen fortfarande ej är substituerade (bundna (bound)) till konstanter. Exempel som liknar bokens exempel: Program database: man(jim). man(fred). woman(x) :- \+ man(x). person(x) :- man(x). person(jane). Har vi denna databas ger frågorna man(jim), man(fred), man(jane) och man(x) vettiga svar, men frågan woman(x)ger svaret no vilket inte är det svar vi skulle få med en logisk läsning, vi vill kanske ha förslaget X = jane. woman(x) ger en körning av man(x) som lyckas med X = jim, varför woman(x) misslyckas och misslyckade körning ger inga substitutioner, bindningar. Inte heller denna definition funger bra : woman(x) :- \+ man(x), person(x). % Fungerar ej om X "unbound" Men denna fungerar bättre: woman(x) :- person(x), \+ man(x). % Fungerar. Detta beror på att när vi kör \+ man(x)så är X=jim, X=fred, eller X=jane och vi får vettiga resultat. Alltså. Konstiga svar när man kör \+ p(..) om inte de logiska variablerna i p(..) är substituerade, "bunda", när vi "kommer till" \+ p(..). Därför fungerar det ofta bättre om \+ "är långt till höger". Inför labben "Stabila äktenskap". Den procedurella läsningen av den lösning jag tänkt mig är att man först genererar man alla tänkbara kombinationer av par (detta var list-labben som förhoppningsvis redan är gjord), sedan testar man att en kombination inte är instabil med hjälp av \+. Vid instatbilitetstesten är då alla logiska variabler substituerade.

Fler icke-logiska saker i Prolog, dvs mer "non-pure Prolog". Det finns en massa saker i Prolog som överhuvud taget inte har en logisk läsning, och en del av dessa saker gör att Prolog kan användas lite mer som ett vanligt programmeringsspråk. read också write m fl för inmatning, och utmatning. Brna Interlude sid 105. \+ negering, not, se ovan. Brna 7.2 sid 6.7 is funktionell "räknemaskin" i Prolog. Brna 6.1.1 sid 54. assert m fl. Program som ändrar sig själv under körningen (livsfarligt). Brna 9.2 sid 91 findall m fl. Genererar lista med lösningar som man sedan kan använda i programmet. set_of Genererar sorterad lista med unika lösningar.! snitt (cut). Gör att man kan avbryta delar av "backtrackingen". Brna 9.1 sid 87. Snitt fungerar så här: a! a Exempel på vad som kan hända om a misslyckas (dvs vi "backtrackar" från a:s Fail-port). Vad som alltid händer om a misslyckas (dvs vi "backtrackar" från a:s Fail-port) och vi har ett snitt omedelbart till vänster om a. Snitt beskär delar av sökträdet. Vi kan använda snitt om vi är klyftigare än Prolog och med säkerhet vet att vissa "backtrackingar" är meningslösa för att vi vet att de ej kan producera nya lösningar. Sådana snitt kallas gröna och program med gröna snitt exekverar snabbare, men om programmet utan snitt har en logisk läsning så har programmet med snitt fortfarande samma logiska läsning. Andra snitt som påverkar körningen så att man får andra lösningar eller färre lösningar kallas röda snitt och förstör den logiska läsningen. \+ (negering, not) är implementerat med snitt på detta sätt \+ X :- X,!,fail. % kör X, lyckas det så passerar vi!, misslyckas, ingen "backtracking". \+ X. % misslyckades körningen "backtrackar" vi hit, vi lyckas.

Man kan skriva \+ X istället för \+(X) eftersom \+ räknas som en operor. Detta är ett rött snitt. Märk också att argumentet (eller operanden) till operatorn \+, dvs X, blir första delmål i högerledet, dvs "data" har plötsligt blivit "kod" eller "program"!!! Detta underlättas ju i Prolog av att sammansatta termer ("data") och delmål ("kod") ser ut på samma sätt: T. ex tall(jim) kan ju ur syntaxsynpunkt t. ex. vara både ett argument till ett predikat eller element i en lista [.., tall(jim),...], men också ett faktum tall(jim). eller ett delmål i ett högerled... :-..., tall(jim),.... När datorer uppfanns var man fascinerad av att "data" vid körningen kunde övergå till "kod" (båda sakerna är ju följder av ettor och nollor), men man kom snart på att det i de flesta fall var alldeles för anarkistiskt att skriva program på detta sätt. Även användning av assert innebär ju att "data" blir "kod". Ett exempel på grönt snitt: Detta predikat är logiskt ekvivalent med minimum(n1,n2,n1) :- N1 <= N2,!. minimum(n1, N2, N1) :- N1 <= N2. minimum(n1,n2,n2) :- N2 < N1,!. minimum(n1, N2, N2) :- N2 < N1. Vi vet ju med våra mattekunskaper att "backtracking" är onödigt eftersom de två delmålen N1 <= N2 och N2 < N1 aldrig samtidigt kan vara sanna. Predikatet med gröna snitt undviker dock meningslös "backtracking". En imperativ programmerare kan ju frestas att förenkla detta till (rött snitt) : predikatet är inte logiskt ekvivalent med minimum(n1,n2,n1) :- N1 <= N2,!. minimum(n1, N2, N1) :- N1 <= N2. minimum(n1,n2,n2). minimum(n1, N2, N2). Prova till exempel minimum(2,5,5) som felaktigt blir sant i predikatet utan!, dvs predikatet med snitt har inte längre någon logisk läsning men påminner om if.. then.. else.. i imperativa språk. I eliza nedan används snitt och sidoeffekts mål, vilket gör att programmet delvis blir som ett imperativt språk. Att lära sig allt om Prolog är säkert en kurs på minst 8 poäng, så.vi är långt ifrån full-lärda. Språket är alltså komplext, men om man lär sig mycket om Prolog kan man skriva mycket mer sofiskerade program än vad vi gjort i denna kurs. I funktionella delen av kursen har vi däremot lärt oss stora delar av vad som finns att lära oss om Haskell, eftersom Haskell innehåller färre element än Prolog, men element som p g a sin generalitet är mycket kraftfulla. För att till fullo uppskatta Haskells potential krävs nog större vana än vi hunnit få i denna kurs.

Tillämpningar av Prolog. Ur förordet i boken Bratko: Prolog Programming for Artificial Intetelligence (tredje upplagan 2001) : The truth is that Prolog is a general programming language and any algorithm can be programmed in it. The impractical orthodox schools s position (dvs att programmen alltid skall ha en logisk deklarativ läsning, "Pure Prolog") was modified by Prolog practioners who adopted a more pragmatic view, benefiting from combining the new declarative approcach with the traditional, procedural one. Om vikten av att lära sig lite om Prolog säger Bratko detta, som även kan sägas om språken i den funktionella paradigmen: Wheras conventional languages are procedurally oriented, Prolog introduces the descripteve, or declarative, view. This greatly alters the way of thinking about problems and makes learning to program in Prolog an exciting intellectual challenge. Many belive that every student of computer science should learn something about Prolog at some point because Prolog enforces a different problem-solving paradigm complementary to other programming languages. AI. Vanliga språk för AI-tillämpningar är Lisp och Prolog eller moderna utvidningar av Prolog, t ex "constraint logic programming", CLP, som kan användas för schemaläggning och planering i logistiska sytem. Med hjälp av Induktiv logikprogrammering konstrueras Prolog-program från exempel. Expertsystem. Program som är tänkta att fungera som en expert på något område som t ex program för att bevilja krediter. Sådan program tänktes utveckas av en "kunskapsingenjör" som kan Prolog som "tappar" en expert på hur denne resonerar, både kvalitativt och kvantitativt. Spelprogram. I Bratkos bok diskuteras bl a schackspelande program. I Sterling och Shapiro Mastermind, Nim och Kalah. I båda böckerna diskuteras också allmänna principer och allmänna program för spel i allmänhet. Tolkar (grammatikor). Brna kap 8. I Prolog är det fascinerande enkelt at skriva enkla program för att kontrollera syntax för (främst formella) språk och även knyta syntaxen till semantiska åtgärder. Jag har bland annat gjort tentamensuppgifter för att kolla kemiska formler som också räknar ut molekylvikter, program för att tolka de franska respektive det danska sättet ( to och halvfems ) att uttrycka tal. Ingår i kursen i år, kommer senare. Sök-problem. Djupet först inbyggd, men andra söktekniker programmeras lätt i Prolog.

Läsanvisning: Paradigmer. Lär dig vilka paradigmer det finns, vad som utmärker dem (semantik) och några exempel på språk. Se föreläsningsanteckningar 1. Viktigt att förstå varför OO används i stället för klassisk imperativ programmering, läs "Vitsen med OO" i föreläsningsanteckningarna. Läsanvisning: Brna Prolog Programming. Brna Kap 1. Hela kapitlet. Brna Kap 2. Hela kapitlet, Jag tycker dock inte att AND- och OR-träd i detta kapitel och nästa förklar så mycket, jag föredrar att förklara den procedurella lösning med Box-modellen. Brna Kap 3. Hela kapitlet. "Resolution tables" och "search space trees" kommer jag inte att fråga om. Jag har dock främst förklarat Prologs sätt att jobba med Byrd-boxar, se kapitel 5. Brna Kap 4. Hela kapitlet. write/1 behöver man inte kunna. Brna Kap 5. Hela kapitlet, dock inte exekverings-träd och bevisträd. Jag har dock mer ingående använt lådmodellen, se i första hand förläsningsanteckningarna. Brna Kap Interlude Practal matters. De mesta i detta kapitel lämpar sig inte för tentafrågor eller ingår inte, men det kan komma frågor på min variant av Byrd-box-modellen och dess förhållande till Sicstus trace-utskrifter, se förläsningsanteckningarna. Brna Kap 6. Hela kapitlet, dock inte bevisträd 6.4. Kapitlet innehåller tips ("schemata") om hur man tänker när man programmerar predikat för listor, tips som vi tillämpat, fast jag inte direkt har föreläst utgående från boken. Brna Kap 7. Kunna lite om negering avsnitt 7.2 och tillräckligt om "generate and test" för att klara labbarna "Tidernas knepigaste problem", "Stabila äktenskap" och liknade tentaproblem. Brna Kap 8. Ingår i kursen. Kommer senare när vi läser om syntaxanalys.. Brna Kap 9. Läs en del om vad snitt, cut (!) är. Även föreläsningsanteckningarna.gröna och röda snitt. Brna Kap 10. Läs 10.1 t o m 10.5. Brna Another Interlude Input/Output. Ingår ej i kursen Brna Kap 11. Ingår ej i kursen Brna Kap 12. Ingår ej i kursen Jag har ju inte följt boken slaviskt, så att läsa förläsningsanteckningarna kan vara bra. Ytterligare exempel. Som avslutning visar jag i dessa förläsningsanteckningar och i nästa förläsningsanteckningar som orientering några program som innehåller en del som vi inte berört så ingående eller till och med inte alls men som exemplifierar vad man kan göra med Prolog och Haskell.

Tävlingsuppgift : Anagram. I programmeringstävlingar förekommer ofta uppgifter av kombinatorisk problem, som ofta lätt kan lösas i Prolog så länge inte problemstorleken är för stor. Ett exempel: Problem 5: Anagram You are to write a program that has to generate all posible words from a given set of letters. Exempel: Given the word "abc" your program should - by exploring all different combinations of the three letters - output the words "abc", "acb", "bac", "bca", "cab" and "cba". In the word some letters may appear more than once. For a given world, your program should not produce the same word more than once, and the word should be output in alphabeticaly ascending order. Prolog-lösning: Prolog-lösning på 10 rader (på /info/progp03/anagram.hs ) som klarar tävlingsledningens näst svåraste problem, strängen zgpdcedfg : % /info/progp03/anagram.pl member(x,[x _]). member(x,[_ Ys]):-member(X,Ys). select(x,[x Ys],Ys). select(x,[y Ys],[Y Zs]):- select(x,ys,zs). permutation(xs, [Z Zs]) :- select(z, Xs, Ys), permutation(ys, Zs). permutation([], []). anagram(xs, Rs) :- setof(as, permutation(xs, As), Pss), strs_to_atoms(pss, Rs). strs_to_atoms([a As], [At Ats]):- name(at, A), strs_to_atoms(as, Ats). strs_to_atoms([], []). Variant för utskrift rad för rad: writeanas([a As]) :- name(at, A), write(at), nl, writeanas(as). write_anagrams(xs) :- setof(as, permutation(xs, As), Pss), writeanas(pss). /* Körning :?-anagram("abc", Rs). Rs = [abc,acb,bac,bca,cab,cba]? yes

*/?- write_anagrams("abc"). abc acb bac bca cab cba Körning av?- write_anagrams("zgpdcedfg"). ger 90 720 anagram. setof(as, permutation(xs, As), Pss) kör andra parametern permutation(xs, As) och samlar ihop de förslag till lösningar av det som står som första parameter As som en lista, tredje parametern Pss. Motsvarighet om vi skulle göra det själv:? - permutation(xs, As). Xs =... As = <v1> ; % Pss = [v1, v2,..., vn] As = <v2> ;... As = <vn> ; no Haskell-lösning. Haskell-lösning på 25 rader (på /info/progp03/anagram.hs) som klarar tävlingsledningens svåraste problem : anagram :: Ord a => [a] -> [[a]] -- /info/progp03/anagram.hs anagram cs = (perm1 (isort False cs) (isort True cs)) where remove :: Ord a => a -> [a] -> [a] remove _ [] = [] -- remove all x from list yys remove x (y:ys) x == y = ys otherwise = y : remove x ys perm1:: Ord a => [a] -> [a] -> [[a]] perm1 [] _ = [[]] -- special verson of permutation perm1 xs zs = [ x:ps x <- xs, ps <- anagram (remove x zs)] isort:: Ord a => Bool -> [a] -> [a] isort dupl [] = [] -- inserttion sort; dupl = remove duplicats? isort dubl (x:xs) = insert dubl x (isort dubl xs) insert:: Ord a => Bool -> a -> [a] -> [a] insert dubl x [] = [x] insert dubl x (y:ys) x == y && (not dubl) = y:ys x <= y = x:y:ys otherwise = y : (insert dubl x ys) {- Main> anagram "aabc" ["aabc","aacb","abac","abca","acab","acba","baac","baca","bcaa", "caab","caba","cbaa"] -}

För att vara med i tävlingen behövs också lite IO-programmering, ca 14 rader, för att läsa och skriva på fil: Input Specification: The input consists of several words. The first line contains a number giving the number of words to follow. Each following line contains one word. Exampel: 2 abc acb Tävlingsledningens hemliga problem finns på inputfile1: 4 abc aabc zgpdcedfg bbbbbbbbbbaaaaaaaaa Detta problem tar några minuter att köra med hugs. Resultatet på filen slask blir på 2.7 Mbyte! Filen inputfile innehåller ett lite mindre problem. -- for participation in competition input/output on files: main :: IO () main = do putstr "Ge infilens namn : " infile <- getline contents <- (readfile infile) let (n:strings) = lines contents result <- loop (read n) strings "" writefile "slask" result loop :: Int -> [[Char]] -> [Char] -> IO [Char] loop 0 _ res = return res loop _ [] res = error " wrong input file" loop i (s:strings) res = do let rs = (concat (map ( \n :) (anagram s))) loop (i-1) strings (res ++ rs) {- Main> main Ge infilens namn : inputfile -} --svaret hamnar på filen slask.