Prolog 1-1 - Miroslav Dobsicek

Transkript

Prolog 1-1 - Miroslav Dobsicek
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

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

Více

Digitální satelitní přijímač Opentel ODS 3000 CI - E

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

Více

Digitální satelitní přijímač STRONG SRT 6155 - E

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

Více

Univerzita Pardubice Fakulta elektrotechniky a informatiky 2010

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

Více

Seznam podporovaných vozidel

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

Více

Seznam vozidel a podporovaných funkcí DS500 ver. 1259

Seznam vozidel a podporovaných funkcí DS500 ver. 1259 8X 8Z 8P 8V 8E 8E 8K 8T 4F 4G 4G 4E 4H 8R 4L

Více

Podporovaná vozidla

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

Více