Logick programov n
Download
1 / 15

Logické programování - PowerPoint PPT Presentation


  • 118 Views
  • Uploaded on

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

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about ' Logické programování' - aoife


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.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
Logick programov n

Logické programování

Přednáška číslo 3


Predik ty i o
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


Predik ty i o1
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


Prvn program
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

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


P klad 1 troj heln k

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


P klad 1 troj heln k1

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 k2

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)


Lohy typu generuj a testuj1
Ú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
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 algebrogram1
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.


P klad 2 algebrogram2
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 algebrogram3
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.



P klad 3 magick tverec

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“


ad