Cvičení 4
Logické programovací jazyky - Prolog
Úloha 1 - Jednoduché příklady
Obecná struktura programu v prologu je tvořena následujícími výrazy:
- Fakty a pravidly
- Dotazy
- Příkazy
Spusťe si SWI-Prolog-Editor (Prolog je k dispozici
zde). Vytvořte soubor uloha1.pl.
Soubor můžete spustit (consult) buď stiskem F9, nebo z menu Start či ikonou Consult.
Vytvořte množinu faktů. Napříkald:
city(bohumin).
city(ostrava).
city(praha).
city(berlin).
Zde jsem si definovali množinu 4 měst. Nyní můžeme klást dotazy. Prolog se je pokusí
vyhodnotit na základě faktů které má. Dotazy mohou obsahovat i proměnné. Proměnné v
Prologu začínají velkým písmenem (pozor u definice faktů). Vyzkoušejte si následující
dotazy:
?-city(bohumin).
?-city(karvina).
?-city(X).
Nyní si můžeme vyzkoušet sestavit nějaké pravidla. Rozšířte množinu vytvořených entit o
počet obyvatel jednotlivých měst.
city(bohumin, 22000).
city(ostrava, 250000).
city(praha, 1000000).
city(berlin, 3500000).
Kladené dotazy můžeme kombinovat. Čárka odpovídá logickému operátoru AND, středník
pak logickému operandu OR. Vyzkoušejte si následující dotaz:
?- city(Y,X), X>500000.
Kromě faktů můžeme definovat i různá pravidla. Pravidlo popisující kdy jedno město je menší
než druhé by mohlo vypadat takto.
smaller(X,Y):-city(X, P1), city(Y, P2), P1<P2.
Vyzkoušejte si následující dotazy.
?- smaller(bohumin, praha).
?- smaller(berlin, praha).
?- smaller(ostrava, X).
Úloha 2 - Rodinné vztahy
Cílem úlohy je simulace rodinných vztahů. Definice rodinných vztahů začíná popisem kdo
je muž a kdo žena a definicí vztahu rodič.
female(amy).
female(johnette).
male(anthony).
male(bruce).
male(ogden).
parentof(amy,johnette).
parentof(amy,anthony).
parentof(amy,bruce).
parentof(ogden,johnette).
parentof(ogden,anthony).
parentof(ogden,bruce).
Nyní bychom mohli definovat například sourozence jako:
siblingof(X,Y) :- parentof(Z,X), parentof(Z,Y).
Definujte i další příbuzenské vztahy jako:
Řešení si můžete stáhnut zde.
Úloha 3 - Složitější funkce
Funkce pro výpočet faktoriálu by mohla vypadat takto.
fac(0,1).
fac(N,F) :- N > 0, M is N - 1,
fac(M,Fm), F is N * Fm.
- Vytvořte funkce počítající největší společný dělitel.
- Vytvořte funkci pro výpočet Fibbonačiho čísla.
- Vytvořte funkci, která spočítá derivaci výrazu. Řešení by mohlo vypadat takto:
derive(X,X,1).
derive(N,X,0) :- number(N).
derive(P1+P2,X,D1+D2) :- derive(P1,X,D1), derive(P2,X,D2).
derive(P1-P2,X,D1-D2) :- derive(P1,X,D1), derive(P2,X,D2).
derive(X**2,X,2*X).
Řešení si můžete stáhnut zde.
Úloha 4 - Umělá inteligence v Prologu
Otevřete si následující soubor bike.pl. Soubor
obsahuje expertní systém pomáhající se stavbou kola. Projděte si program.
Program demonstruje použití seznamů či výpisy v prologu. Program si vyzkoušejte:
?-partlist( bike ).
Výsledkem programu je soupis součástek nutných pro sestavení kola.