Logické programování Přednáška číslo 3.

Slides:



Advertisements
Podobné prezentace
Standardní knihovní funkce pro práci s textovými řetězci
Advertisements

Začínáme s Pascalem 1. kapitola.
VISUAL BASIC Práce s řetězci Použitá literatura: Kvoch: Visual Basic 4.
Orbis pictus 21. století Tato prezentace byla vytvořena v rámci projektu.
Počítače a programování 1 Přednáška 13 Jiří Šebesta.
Pascal - příklady.
MATLAB LEKCE 7.
VISUAL BASIC Práce se soubory.
Slovní úlohy o pohybu Varianta 1: Pohyby proti sobě (1. část)
Algoritmy I. Cvičení č. 10.
Konstrukce trojúhelníku Podle věty sss b a c 1. Přiřaď názvy stran na správné místo. C A B Kantor nejdříve nechá žáky vyřešit tuto otázku. A B.
Některé pojmy teorie grafů I. Příklad: log p ABC = u 0 + u A + u B + u C + u AB + u AC A B C.
Cvičení 2 Proměnné(jednoduché a složené) a konstanty První program Zápis výrazů.
Algoritmy I Cvičení č. 4.
Algoritmy I Cvičení č. 3.
ÚLOHY Z GEOMETRIE Učivo – KRUŽNICE A KRUH
Gymnázium Jiřího Ortena KUTNÁ HORA
 př. 7 výsledek postup řešení Vypočti velikost obsah trojúhelníku ABC. A[-2;1;3], B[0;1;3], C[-2;1;-1]
Orbis pictus 21. století Tato prezentace byla vytvořena v rámci projektu.
Jemný úvod do MATLABu © Leonard Walletzký, ESF MU, 2000.
Dostupné z Metodického portálu ISSN: , financovaného z ESF a státního rozpočtu ČR. Provozováno Výzkumným ústavem pedagogickým v Praze.
Matice.
Počítače a programování 1
Orbis pictus 21. století Tato prezentace byla vytvořena v rámci projektu.
Čtyřúhelníky Základní pojmy.
26.1 Druhy a vlastnosti rovnoběžníků III. KONSTRUKCE
Výpis z pravdivostní tabulky a následná minimalizace
10.1 Čtverec D C D C a D C Vrcholy čtverce A , B , C , D
Pythagorova věta.
JUI přednáška Vstup a výstup, cykly RNDr. Jiří Dvořák, CSc.
Soubory BI-PA1 Programování a algoritmizace 1, ZS Katedra teoretické informatiky © Miroslav Balík Fakulta informačních technologií České vysoké.
Matematická olympiáda 2009/10
Stereometrie Odchylky přímek VY_32_INOVACE_M3r0114 Mgr. Jakub Němec.
Vstup: Úplný graf G=(V,E), ohodnocení hran d:E → R + Výstup: Nejkratší Hamiltonovská cesta HC v grafu G Najdi minimální kostru K grafu G Pokud K neobsahuje.
Stereometrie Kolmost přímek a rovin Mgr. Jakub Němec
32.
Programování v MATLABu © Leonard Walletzký, ESF MU, 2000.
Algoritmizace a programování Algoritmy 2 – Vývojové diagramy (sekvence)
Elektronické učební materiály - I. stupeň Matematika 4 Autor: Mgr. Helena Záděrová 1. Kde žili pravěcí lidé v 2. Savec uctívaný v Egyptě 3. Největší zvíře.
Programovací jazyk C# 2. část. Datové typy C# rozeznává dva druhy datových typů, hodnotové a referenční. Hodnotové datové typy Proměnné hodnotového datového.
Dostupné z Metodického portálu ISSN: , financovaného z ESF a státního rozpočtu ČR. Provozováno Výzkumným ústavem pedagogickým v Praze.
Moduly.
Množina bodů dané vlastnosti
Algoritmizace a programování
C# konzole – Vstup a výstup
ANALYTICKÁ GEOMETRIE V ROVINĚ vzdálenost dvou bodů střed úsečky
C# konzole – Podíl dvou čísel, podmínka IF
Výukový materiál zpracován v rámci projektu
Slovní úlohy o pohybu Pohyby proti sobě s časovým posunem.
Název projektu: Moderní výuka s využitím ICT
Vzájemná poloha přímky a roviny
Konstrukce trojúhelníku
Vzorové řešení zápočtového testu
Algoritmizace a programování
Rekurze.
Kurz algoritmizace a programování v jazyce C
Výukový materiál zpracován v rámci projektu
Výukový materiál zpracován v rámci projektu
Konstrukce trojúhelníku
ZÁKLADNÍ ŠKOLA, JIČÍN, HUSOVA 170 Číslo projektu
Název projektu: Moderní výuka s využitím ICT
Přednášky z distribuovaných systémů
Slovní úlohy o pohybu Varianta 1: Pohyby proti sobě (1. část)
1. ZÁKLADNÍ VLASTNOSTI ČTVERCE 2. OBVOD A OBSAH ČTVERCE – SLOVNÍ ÚLOHY
Logické programování Prezentace číslo 5.
Opakování na 2.písemnou práci
Soustavy lineárních rovnic
Algoritmizace a datové struktury (14ASD)
Konstrukce rovnoběžníku
Konstrukce kosočtverce
Transkript prezentace:

Logické programování Přednáška číslo 3

Predikáty I/O read(X) - načtení vstupu z klávesnice do proměnné X (zadání musí končit tečkou). Chceme-li načíst řetězec začínající velkým písmenem, je nutné zadat jej v apostrofech. ?- read(A). ?- read(A). : ales. : ‘Tom’. A = ales A = ‘Tom’ write(X) - výpis proměnné X nebo zadaného řetězce na obrazovku nl  - odřádkování výpisu ?- write(ahoj), nl. ahoj yes

Predikáty I/O getb(X) - načtení tisknutelného nebo i netisknutelného znaku a uložení jeho ascii-hodnoty do proměnné X, vstup se neukončuje tečkou ?- getb(X). X = 97 % uživatel stiskl klávesu „a“ ?- write('Cekam na stisk klavesy ...'), getb(_), nl. Cekam na stisk klavesy ... yes tab(N) -  výpis N mezer ?- write(ahoj), tab(3), write(konec), nl. ahoj konec

První program program:-write('Zadejte prosim sve krestni jmeno:'), read(Jm), write(Jm), write(' je moc hezke jmeno!'), nl, write('Stisknete libovolnou klavesu ...'), getb(_), nl, write('Program byl ukoncen.'), nl. ?- program. Zadejte prosim sve krestni jmeno: jirka. jirka je moc hezke jmeno! Stisknete libovolnou klavesu ... Program byl ukoncen. yes

Úlohy typu „generuj a testuj“ Mezi velkým množstvím potenciálních řešení hledáme pouze taková, která vyhovují všem omezujícím podmínkám zadání úlohy Příklad 1 Rozmístěte čísla 1 – 6 do vrcholů a středů stran trojúhelníka tak, aby součty čísel na všech stranách byly shodné. A B F C D E

Příklad 1 – trojúhelník cislo(1). cislo(2). … cislo(6). % mame k dispozici 6 cisel reseni(A,B,C,D,E,F):- cislo(A), cislo(B), cislo(C), cislo(D), cislo(E),cislo(F), A\=B, A\=C, A\=D, A\=E, A\=F, B\=C, B\=D, B\=E, B\=F, C\=D, C\=E, C\=F, D\=E, D\=F, E\=F, A+B+C =:=A+F+E, A+B+C =:= C+D+E. % nešikovné řešení % testuje se: 111111, 111112, 111113, .... A B F C D E

Příklad 1 – trojúhelník reseni2(A,B,C,D,E,F):- cislo(A), cislo(B),A\=B, % JIZ PRVNI TEST cislo(C),A\=C,B\=C, Souc is A+B+C, cislo(D),A\=D,B\=D,C\=D, cislo(E),A\=E,B\=E,C\=E,D\=E, Souc is C+D+E, % totéž jako A+B+C =:= C+D+E cislo(F),A\=F,B\=F,C\=F,D\=F,E\=F, Souc is E+F+A. % totéž jako A+B+C =:= E+F+A % testuj okamžitě, když můžeš = efektivnější postup % testuje se:123456, 123465, 123546, ...

Příklad 1 – trojúhelník Souc is A+B+C, F C D E reseni3(A,B,C,D,E,F):- cislo(A), cislo(B),A\=B, cislo(C),A>C,B\=C, % oproti A\=C se zavádí pořadí vrcholů v řešení -> jednoznačnost Souc is A+B+C, cislo(D),A\=D,B\=D,C\=D, cislo(E),A\=E,B\=E,C>E,D\=E, Souc is C+D+E, cislo(F),A\=F,B\=F,C\=F,D\=F,E\=F, Souc is E+F+A. % generují se pouze navzájem různá řešení (zde 4, u reseni2 jich je 24)

Úlohy typu „generuj a testuj“ Příklad 2 Algebrogram Cílem je dosadit za neznámá písmena číslice tak, aby naznačená matematická operace dávala korektní výsledek. Například: SUMEC SEND *3 +MORE JEZERO MONEY

Příklad 2 - algebrogram Zadání Vyřešte algebrogram SEND +MORE MONEY při dodržení podmínky M ≠ 0. Proměnné S,E,N,D,M,O,R,Y Možné hodnoty 0,1,2,3,4,5,6,7,8,9

Příklad 2 – algebrogram reseni:-cislo(S), cislo(E),S\=E, cislo(0). % mame k dispozici 10 cisel cislo(1). … cislo(9). reseni:-cislo(S), cislo(E),S\=E, cislo(N),S\=N,E\=N, cislo(D),S\=D,E\=D,N\=D, cislo(M),M\=0,S\=M,E\=M,N\=M,D\=M, cislo(O),S\=O,E\=O,N\=O,D\=O,M\=O, cislo(R),S\=R,E\=R,N\=R,D\=R,M\=R,O\=R, cislo(Y),S\=Y,E\=Y,N\=Y,D\=Y,M\=Y,O\=Y,R\=Y, 1000*S+100*E+10*N+D + 1000*M+100*O+10*R+E =:= 10000*M+1000*O+100*N+10*E+Y, % test součtu write(‘ ‘:S:E:N:D), nl, write(‘ ‘:M:O:R:E), nl, write(‘----------’), nl, write(M:O:N:E:Y), nl.

Příklad 2 - algebrogram Předchozí program funguje, ale je pomalý, protože neuplatňuje zásadu provedení testu v co možná nekratším okamžiku generování Namísto testování „po řádcích“ se nabízí alternativa testování „po sloupcích“, která mnohem dříve zabrání generování možností, které nevedou k cíli SEND SEND +MORE +MORE MONEY MONEY Program jistě bude rychlejší, ale nesmíme při sčítání zapomenout na možné přenosy mezi sloupci.

Příklad 2 – algebrogram res2:- cislo(D), cislo(E),E\=D, S1 is D+E, cislo(Y),Y\=E,Y\=D, Y is S1 mod 10, Pr1 is S1//10, cislo(N),N\=Y,N\=E,N\=D, cislo(R),R\=N,R\=Y,R\=E,R\=D, S2 is N+R +Pr1, E is S2 mod 10, Pr2 is S2//10, cislo(O),O\=R,O\=N,O\=Y,O\=E,O\=D, S3 is E+O+Pr2, N is S3 mod 10, Pr3 is S3//10, cislo(S),S\=0,S\=O,S\=R,S\=N,S\=Y,S\=E,S\=D, cislo(M),M\=0,M\=S,M\=O,M\=R,M\=N, M\=Y,M\=E,M\=D, S4 is S+M+Pr3, O is S4 mod 10, M is S4 // 10, write(‘ ‘:S:E:N:D), nl, write(‘ ‘:M:O:R:E), nl, write(‘----------’), nl, write(M:O:N:E:Y), nl.

Příklad 2 - algebrogram

Příklad 3 – magický čtverec Pro čtverec o rozměru N*N doplňte čísla 1 až N2 tak, aby součty čísel v každém řádku, v každém sloupci a na obou úhlopříčkách byly stejné Vhodný postup: Generování čísel v takovém pořadím, abychom s testem příliš nečekali Víme, kolik má součet v každé linii vyjít, čímž lze výpočet podstatně urychlit Třetí číslo v linii lze při známém součtu linie dopočítat a je zbytečné jej generovat způsobem „pokus-omyl“ A B F C D E I G H

Rekurze Definování objektu pomocí sebe sama Rekurzivní volání přímé – funkce volá sama sebe (f volá f) nepřímé (kruhové) – vzájemné cyklické volání několika funkcí (f1 volá f2 a potom f2 volá f1) Podmínky úspěšného použití rekurze v každém kroku musí dojít ke „zjednodušení“ problému (vykonání konkrétního kroku směrem k cíli) musí být vhodně definována ukončovací podmínka

Příklady použití rekurze % predek(predek_osoby_Y, osoba_Y) predek(X,Y):-rodice(X,_,Y). predek(X,Y):-rodice(_,X,Y). predek(X,Y):-rodice(O,_,Y), predek(X,O). predek(X,Y):-rodice(_,M,Y), predek(X,M). % špatně provedená rekurze predek(X,Y):-predek(X,O), rodice(O,_,Y). predek(X,Y):-predek(X,M), rodice(_,M,Y).

Příklady použití rekurze Nepřímá rekurze % matka(Matka, Dite) matka(alena,pepik). matka(M,D) :- dite(D,M). dite(D,M) :- matka(M,D). ?- matka(X,Y). X = alena , Y = pepik ; …

Příklady použití rekurze Nepřímá rekurze % ještě hůře provedená rekurze matka(M,D) :- dite(D,M). dite(D,M) :- matka(M,D). matka(alena,pepik). ?- matka(X,Y). Error 1, Backtrack Stack Full, Trying matka/2 Aborted