Prolog 1-1 - Miroslav Dobsicek
Transkript
Prolog 1-1 - Prolog znamená programování v logice - namísto otázky jak se má získat určitá hodnota se ptáme co platí mezi objekty - vhodný jazyk pro úlohy kde nás zajímají vztahy mezi objekty - namísto definic funkcí zapisujeme klauzule, které společně s vyhodnocovacím mechanismem umožňují odpověd uživatelovi na otázku zda nějaký vztah je splnitelný nebo ne klauzule - 3 typy: fakta - vyjadřují bezpodmíněčně pravdivá tvrzení term. pravidla - vyjadřují tvrzení zavislá na splnění určitých podmínek term0 := term1, term2, ..., termN. dotazy - vyvolávají výpočet za účelem zjistit, zda je dotaz splnitelný či nikoliv ?- term1, term2, ..., termN. Během procesu vyhodnocení dochází v případě úspěchu k nastavení proměných na takové hodnoty, které umožní splnitelnost. Je-li více možností je Prolog schopen nalézt je všechny pomocí zpětného prohledávání (backtracking). Rodinné vztahy pomocí Prologu: fakta: rodic(jarda,marie). rodic(jarda,pepa). rodic(marie,bozena). rodic(marie,tonda). muz(tonda). zena(bozena). dotazy: ?- rodic(jarda,pepa). -> yes ?- rodic(jarda,tonda). -> no ?- rodic(jarda,X) -> X=marie; Y=pepa; no %středník vyvolá další řešení Řetězec, který začíná velkým písmenem je považován za proměnou a Prolog se snaží nastavit jeho hodnotu, tak aby dotaz byl splnitelný. Anonymní proměnnou, která nás nezajímá značíme pomocí podtržítka _. pravidla: (zkusíme nalézt jméno Jardovy babičky) babicka(Vnuk,X) :- rodic(Vnuk,Y), rodic(Y, X), zena(X). dotaz: ?- babicka(jarda, X) -> X=bozena; no - nejdříve se nalezne relace ve které Vnuk (Jarda) vystupuje jako syn nějakého rodiče Y. Dále pro osobu Y zkusíme nalézt relaci, ve které vystupuje jako dítě Xka. Pro X potom ještě ověříme existenci relace býti ženou. Čárky mezi termy mají tedy význam logického AND. Prolog 1-2 Datové objekty v Prologu - jednoduché objekty - konstanty - atomy např. jarda, neco - čísla např. 10, -3 - proměnné např. X, Vnuk, _ - struktury např. vyuka(predmet(jui, cviceni), doba(streda), ucitel(dobsicek, miroslav)) Dotaz na všechna cvičení konkrétního učitele: cvicici(Ucitel, Predm) :- vyuka(predmet(Predm, cviceni), _, Ucitel). Deklarativní a procedurální sémantika programu Mějme klazuli tvaru P :- Q, R, kde P, Q, R jsou libovolné tvary termů. deklarativní pohled: P je pravdivé, jestliže Q i R jsou pravdivé; z platnosti Q a R plyne platnost P; atd .. procedurální pohled: aby se vyřešil problém P, je potřeba nejprve vyřešit problém Q a potom problém R; aby se splnil cíl P, je potřeba nejprve splnit cíl Q a potom cíl R Seznamové a číslicové operace Seznam se v Prologu zapisuje jako [bohous, jarda, pepa, milan]. Vnitřní reprezentace je opět pomocí tečka dvojice .(bohous, .(jarda, .(pepa, .(milan, [])))). Prázdný seznam se značí pomocí [], atom nil zde neexistuje. Pomocí operátoru | můžeme seznam rozdělit na prvních pár prvků a zbytek. [bohous, jarda | [pepa, milan]] Predikát member: member(X, [X | Zbytek]). member(X, [ Zacatek | Zbytek]) :- member(X, Zbytek). příklad: member(2, [1,2,3]). -> yes member(X, [1,2,3]. -> X = 1; X = 2; X = 3; no Mezi jednotlivými klauzulemi je logiké OR. Protože v podstatě provádíme definici vzorem musí umět Prolog důkladně srovnat hlavu pravidla a cíle. Dva termy se rovnají když jsou identické nebo proměnné lze nastavit na takové hodnoty aby se získaly indentické termy -> unifikace – aktivní mechanismus jehož výsledkem je ano/ne. Vložení na začátek seznamu: ins(X, L, [X | L]). příklad: ins(elf, [honza, pepa], L). -> L = [elf, honza, pepa] Prolog 1-3 Ubrání prvku ze seznamu: del1(X, [X|T], T). příklad: del1(1, [1,2,3], X) => X=[2,3] delx(X, [X|T], T). delx(X, [Z|L], [Z|LO]) :delx(X, L, LO). příklad: delx(1,[1,2,1,3],X). => X=[2,1,3]; X=[1,2,3]; no Test na seznam: list([]). list([_|_]). příklad: list([1,2,3]). => yes list(1). => no Spojení dvou seznamů: append([], L, L). append([Head | Rest], L , [Head | Newrest]) :append(Rest, L , Newrest). příklad: append([1,2], [3,4], [1,2,3,4]). => yes append([1,2], [3,4], X). => X=[1,2,3,4] append([1,2], X, [1,2,3,4]). => X=[3,4] append(X, [3,4], [1,2,3,4]). => X=[1,2] Test na celé kladné číslo: isint(0). isint(N) :isint(N1), N is N1 + 1. příklad: isint(5) -> true isint(-5) -> % při pokusu o další vyhodnocení nám to zkončí v nekonečném hledání % zkočíme v nekonečném hledání Prolog 1-4 Součet čísel v seznamu: sum([],0). sum([H | T], S) :integer(H), sum(T, S1), S is S1 + H. příklad: sum([1,2,3], X). => X=6 Délka seznamu: len([], 0). len([_ | T],N) :len(T, N1), N is N1 + 1. příklad: len([1,2,3], X). => X=3 Výběr nejmenšího prvku seznamu: min_list([X], X). min_list([H | T], H) :min_list(T, X), H =< X. min_list([H | T], X) :min_list(T, X), H > X. příklad: min_list([3,4,1,2],X). => X=1 Jednosměrný faktoriál: fact(0,1). fact(N,F) :N > 0, N1 is N - 1, fact(N1,F1), F is F1 * N. příklad: fact(5,X). => X=120 fact(X,120). => ??? % jedním směrem je to fajn % druhým už moc ne Prolog 1-5 Obousměrný faktoriál: testfact(Akt,Poz,F) :fact(Akt,F), Poz is Akt. testfact(Akt,Poz,F) :fact(Akt,FS), FS < F, S1 is Akt + 1, testfact(S1,Poz,F). fact(0,1). fact(N,F) :var(N), testfact(1,N,F). fact(N,F) :N > 0, N1 is N - 1, fact(N1,F1), F is F1 * N. příklad: fact(5,X). => X=120 fact(X,120). => X=5
Podobné dokumenty
Digitální satelitní komplet OPENTEL ODS-3500FL - E
CryptoWorks, Nagravision, Irdeto a jiné
UHF modulátor 21 ~ 69k
display zobrazující číslo sledovaného programu nebo čas
paměť pro 4000 TV a Rádiových předvoleb
50 naprogramovaných družic v seznamové...
Digitální satelitní přijímač Opentel ODS 3000 CI - E
funkce editace názv TV program , stanic, skupin
oblíbených program apod.
rodi ovský zámek
jednoduché vyhledávání nových program
výb r up ednostn ní Audio zvuk a titulk
rychlá zm na kanál
automatick...
Digitální satelitní přijímač STRONG SRT 6155 - E
menu v eském jazyce
p ední panel imitace hliníku s možností vým ny
podbarveného krytu
možnost p ipojení externího idla pro dálkové ovládání
display zobrazující íslo sledovaného programu nebo as
UHF...
Univerzita Pardubice Fakulta elektrotechniky a informatiky 2010
Každý souborový systém má superblok (jak je souborový systém velký, kde jsou
uloženy další kopie iuzlů, . . .), dále je umístěn seznam i-uzlů (i-node) (informace
o souborech) a dále vlastní datová ...
Seznam podporovaných vozidel
8J
E81
E81
E82
E82
E87
E87
E88
E88
F20
F21
E46
E90
E90
F30
F34
E39
E39
E60
E60
F10
F11
F07
E63
E63
E64
E64
E65
E65
E66
E66
E67
E67
E68
E68
F01
F02
F04
E84
E38
F25
E53
E70
F15
E71
E72
E89
T300
Seznam vozidel a podporovaných funkcí DS500 ver. 1259
8X
8Z
8P
8V
8E
8E
8K
8T
4F
4G
4G
4E
4H
8R
4L
Podporovaná vozidla
Povolit OEM alarm v BSI jednotce
Povolit OEM alarm v BSI jednotce
Povolit OEM alarm v BSI jednotce
Povolit OEM alarm v BSI jednotce
Povolit OEM alarm v BSI jednotce
Povolit OEM alarm v BSI jednotce