Logické programování
Organizační záležitosti:
- Zápočet bude udělen za odevzdání domácího úkolu (bude zadán v druhé polovině semestru).
- Na cvičeních budeme používat SWI Prolog (například v kombinaci s textovým editorem Visual Studio Code).
- Cvičení probíhají jen v sudé týdny: 22.9., 6.10., 20.10., 3.11.,
17.11., 1.12.,15.12.
Zápočtové úkoly
Odevzdejte na můj email do 14.1. 2024.
- úkol 3 z dokumentu Olinx 3 ("Programovací jazyk PROLOG, 3. díl")
- úkol 3 z dokumentu Olinx 4 ("Programovací jazyk PROLOG, 4. díl"), na vhodném místě použijte řez
Uzly binárního vyhledávacího stromu budeme representovat termy ve tvaru
node(key, val, left, right)
, kdekey
aval
representují klíč a hodnotu v uzlu aleft
aright
je levý a pravý podstrom. Prázdný podstrom budeme značit atomemnil
. Příklad stromu, kde klíče jsou znaky:node(d, 10, node(c, 2, node(b, 35, nil, nil), nil), node(f, 5, node(e, 11, nil, nil), node(g, 13, nil, nil)))
Naprogramujte efektivní vkládání do binárního vyhledávacího stromu. Napište pravidla pro predikát
pridej
/4, který má vstupní argumenty: klíč, hodnotu a strom. Výsledkem je strom vzniklý vložením nového uzlu. Pokud již ve stromu existuje uzel s daným klíčem, pouze přepište starou hodnotu v uzlu.-
Uvažte následující fragment seznamu frekvencí slov pro rozsáhlý anglický text:
w(5,2186369,a,det). w(2107,4249,abandon,v). w(5204,1110,abbey,n). w(966,10468,ability,n). w(321,30454,able,a). w(6277,809,abnormal,a). w(3862,1744,abolish,v). w(5085,1154,abolition,n). w(4341,1471,abortion,n). w(179,52561,about,adv). w(69,144554,about,prep). w(3341,2139,above,a). w(942,10719,above,adv). w(786,12889,above,prep). w(2236,3941,abroad,adv). w(5106,1146,abruptly,adv).
Formát je následující:
w(Pořadí,Frekvence,Slovo,TřídaSlova)
Pořadí
je 1 pro nejčastější slovo.TřídaSlova
je kategorie:det
pro určitel,v
pro sloveso,n
pro podstatné jméno,a
pro přídavné jméno atd.Program je deterministický, pokud a pouze pokud neuspěje více než jednou.
- Napište deterministický program
ambiguous
(vypíše jen jedno řešení), takový, žeambiguous(Slovo)
uspěje, pokud a pouze pokud Slovo je v seznamu frekvencí slov s více než jednou kategorií (lze použít standardní aritmetické predikáty). - Napište deterministický program
display
, který vytiskne n nejčastějších slov a odpovídající kategorie ve frekvenčním seznamu slov, kde n je argumentem predikátu. Pro výše uvedený fragment například:?- display(500). a det able a about adv about prep Yes
Lze použít standardní predikáty jako
fail
,write
anl
.
- Napište deterministický program
Cvičení 5
V následujícím textu lze předpokládat, že všechny prvky seznamů jsou celá čísla. Uvažujte program v Prologu s názvem
cutoff
, kdecutoff(Seznam1, Seznam2)
uspěje pouze tehdy, kdyžSeznam2
představuje nejdelší prefixSeznam1
bez záporných prvků. Příklady dotazů v Prologu:?- cutoff([1,-2,3],[1]). Yes ?- cutoff([1,-2,3],[1,-2,3]). No
- Napište verzi programu v Prologu
cutoff
bez použití operátorů řezu (!
) neboif-then-else
. - Napište verzi programu v Prologu
cutoff
s použitím operátorů řezu (!
) a s nejvýše jedním použitím aritmetických porovnávacích operátorů.
- Napište verzi programu v Prologu
- úkol 2 z dokumentu Olinx 3 ("Programovací jazyk PROLOG, 3. díl"), s použitím řezu.
?- slij([1,3,5],[2,3,6],X). X = [1, 2, 3, 3, 5, 6].
Cvičení 4
Modelování aritmetiky
%% prirozene cislo natural(0). natural(s(X)) :- natural(X). %% scitani prirozenych cisel add(X,0,X). add(X,s(Y),s(Z)) :- add(X,Y,Z).
- Vytvořte pravidla pro predikáty even/1 (číslo je sudé), odd/1 (číslo je liché). Dále definujte predikáty leq/2 a lt/2 přirozeného uspořádání a ostrého uspořádání přirozených čísel. Predikáty otestujte.
- Vytvořte pravidla definující predikát mul/3 vyjadřující vztah „X krát Y je rovno Z“. Využijte známého faktu, že výsledek součinu x a následníka y je roven součinu x a y plus x. Pomocí násobení dále definujte predikát pow/3 reprezentující celočíselnou mocninu.
- Pomocí již hotových predikátů napište pravidla pro výpočet faktoriálu a Fibonacciho čísla.
Cvičení 3
- úkoly 1, 2, 3 a 4 z dokumetu "Programovací jazyk PROLOG, 2. díl"
Cvičení 2
-
Vozidla
Přečtěte si následující ukázkový text. Podle textu vytvořte vhodnou databázi faktů, tak, aby bylo v databázi uloženo co možná nejvíce informací z tohoto textu. Pokud nebudou fakta vhodně formalizována, v dalším příkladu bude obtížné sestavovat některé dotazy.
Auta jsou dvoustopá vozidla, která jezdí buďto na benzin, na naftu nebo na plyn. Auta se řídí volantem. Motorky jsou jednostopá vozidla a jezdí na benzin. Motorky mají řídítka. Kola nemají motor, jsou jednostopá a mají řídítka. Pavel má kolo i auto. Mirek má motorku a auto. Petr má kolo. Vilém nemá žádný dopravní prostředek.
Vyzkoušejte vytvořit pravidla pro následující dotazy.
- Která vozidla jezdí na benzin?
- Kteří lidé vlastní jednostopé dopravní prostředky?
- Kdo řídí svůj dopravní prostředek volantem?
- Existují některé jednostopé dopravní prostředky, které se řídí volantem?
- Které dopravní prostředky mají řídítka?
Databáze koček
Prolog a jeho inferenční mechanismus lze využít jako jednoduchý dotazovací jazyk. Definice faktů můžeme chápat podobně, jako jsou v relačních databázích chápány tabulky, dotazy nad daty uloženými v tabulkách jsou v PROLOGu reprezentovány vytvářením vhodných cílů, případně dalších pravidel.
Nyní budeme uvažovat databázi informací o vybraných kočičích plemenech, viz soubor cats.pl
. Základní informace o kočkách jsou reprezentovány jako fakta pomocí tří základních predikátů,
- kocka(Jmeno,Velikost,Povaha,Hlucnost,Srst)
- barvy(Jmeno,Barva)
- barvy_oci(Jmeno,Barva)
- Které kočky mají aktivní povahu?
- Jakou barvu srsti a očí může mít tonkinská kočka?
- Které dlouhosrsté kočky jsou malé?
- Které kočky jsou velké a tiché?
- V jakých barvách se vyskytují polodlouhosrsté kočky?
- Jak se jmenují polodlouhosrsté kočky?
- Které kočky mohou být bílé?
Jméno kočky lze chápat v databázové terminologii jako primární klíč, to jest jednoznačný identifikátor každého plemene kočky. Vytvářením nových odvozovacích pravidel a vhodnými dotazy můžeme získávat informace z této databáze.
Z databáze zjistěte následující informace. Pomozte si vytvořením dodatečných pravidel. Jména koček, názvy vlastností, barev, etc., jsou v databázi bez diakritiky.
Cvičení 1
Popis zvířat
Formalizujte následující slovní popis a přepište jej do prologu:
„Medvěd je velký, slon je velký. Kočka je malá, myš je malá. Medvěd je hnědý, kočka je černá, slon je šedý, myš je šedá. Vše černé a vše hnědé je tmavé.“
Poté (v PROLOGu) napište dotaz, kterým zjistíte, kdo všechno je šedý a druhý dotaz, kterým zjistíte, kdo je tmavý a současně velký.
Databáze příbuzenských vztahů
Uvažme následující PROLOGovský program:
rodic(pavla,robert). rodic(tom,robert). rodic(tom,liza). rodic(robert,anna). rodic(robert,patricie). rodic(patricie,jan). rodic(jan,simon). rodic(jan,ester). zena(pavla). zena(liza). zena(anna). zena(patricie). muz(tom). muz(simon) muz(robert). muz(jan). potomek(Y,X) :- rodic(X,Y). matka(X,Y) :- rodic(X,Y), zena(X). prarodic(X,Z) :- rodic(X,Y), rodic(Y,Z). sestra(X,Y) :- rodic(Z,X), rodic(Z,Y), zena(X), not(X=Y). predek(X,Z) :- rodic(X,Z). predek(X,Z) :- rodic(X,Y), predek(Y,Z).
K právě uvedenému programu doplňte čtyři fakta obsažená ve větě „Jan je rodičem chlapce Šimon a dívky Ester.“ a definujte tři pravidla:
- binární relaci
deda
, - binární relaci
bratr
, - binární relaci
vnouce
.
Poté položte čtyři dotazy:
- Koho je Šimon vnouče?
- Kdo je bratr Lízy?
- Kdo všechno je dědou?
- Kdo všechno jsou předci Ester?
- binární relaci