1 / 15

Logické programování

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’ .

aoife
Download Presentation

Logické programování

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

  2. 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 = alesA = ‘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

  3. 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 yes

  4. 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

  5. A B F C D E Ú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é.

  6. 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, ....

  7. 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, ...

  8. A B F C D E Příklad 1 – trojúhelník 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í (zde4, u reseni2 jich je 24)

  9. Ú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

  10. 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

  11. Příklad 2 – algebrogram 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.

  12. 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.

  13. Příklad 2 – algebrogram res2:- cislo(D), cislo(E),E\=D,S1 is D+E, cislo(Y),Y\=E,Y\=D, Y isS1mod 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 isS2mod 10,Pr2 is S2//10, cislo(O),O\=R,O\=N,O\=Y,O\=E,O\=D,S3 is E+O+Pr2, N isS3 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 isS4mod 10, M isS4 // 10, write(‘ ‘:S:E:N:D), nl, write(‘‘:M:O:R:E),nl, write(‘----------’), nl, write(M:O:N:E:Y), nl.

  14. Příklad 2 - algebrogram

  15. A B C D E F G H I 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“

More Related