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: 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.
  1. Vytvořte funkce počítající největší společný dělitel.
  2. Vytvořte funkci pro výpočet Fibbonačiho čísla.
  3. 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.