Logické programování I

Základy programování v jazyce Prolog

Autor: Vojtěch Svátek

Vydala Vysoká škola ekonomická v Praze, 2003. První vydání, 137 stran. ISBN 80-245-0627-0

Informace

Na této straně jsou postupně zveřejňovány texty ukázkových programů, a také chyby a doplňující informace ke skriptům.

Struktura skript a ukázkové programy




Chyby a doplňující informace

Kap.3.1.3 Datove struktury

V příkladu datové struktury popisující souřadnice trojúhelníku na s.45 je chyba, druhá a třetí souřadnice by samozřejmě neměly být stejné. Zápis by tedy měl být např.

trojuhelnik(0,0,0,1,1,0).
resp.
trojuhelnik(v(0,0),v(0,1),v(1,0)).
Taktéž i v diagramu na s. 46.

Kap.3.1.4 Seznamy

V tabulce 3.1 na s.50 u druhého a třetího příkladu neodpovídá základní a seznamová notace. Seznam .(b,.(a,[])) se zapíše jako [b,a] a ne jako [a,b], a analogicky seznam .(c,.(b,.(a,[]))) se zapíše jako [c,b,a] a ne jako [a,b,c].

Kap.3.2.3 Přehled nejdůležitějších vestavěných operátorů

V seznamu typů operátorů chybí část textu u páté odrážky, má tam být

Kap.4.2.3 Aritmetické funkce

Na tomto místě by asi bylo dobré shrnout, jaké významy na sebe v jednotlivých "vrstvách" nabalují určité symboly. Např. symbol "+" je v první řadě syntakticky atomem složeným z jediného speciálního znaku. Jakožto atom může hrát roli funktoru libovolné struktury (s libovolnou aritom). Díky tomu, že je (stále syntakticky) deklarován jako infixový operátor, může se v rámci binárních struktur zapisovat infixově. A teprve v "nejvrchnější vrstvě" má přiřazenou sémantiku aritmetické funkce, která se uplatní pouze v případě, kdy je vyhodnocován jako součást výrazu na levé či pravé straně aritmetického porovnání, nebo na pravé straně operátoru is. Obdobně symbol "sqrt" je syntakticky atomem, v tomto případě složeným z alfanumerických znaků. Opět tudíž může hrát roli funktoru. Není deklarován jako operátor; avšak bez ohledu na to je aritmetickou funkcí.

Kap.4.4 Seskupování řešení cíle

Je potřeba upozornit, že predikát findall je mnohem silnější, než by se na první pohled zdálo. Term totiž nemusí být jen atomický, a především, Cil může být složeným cílem. Oboje si můžeme ukázat na následujícím příkladu dotazu:

?- findall(provdal_za(X,Y,Z),(otec(X,Y),manzelka(Y,Z)),M).
Tento dotaz, jak si můžete vyzkoušet, vrátí seznam ternárních struktur vyjadřujících, kdo za koho provdal kterou svou dceru. Pro úplnost, seznam bude zřejmě přehlednější, když místo běžného funktoru použijete operátory, např.:
?- findall(X:Y->Z),(otec(X,Y),manzelka(Y,Z)),M).

Kap.5.2.3 Rekurzivní cyklus s aritmetickým výpočtem

Obsah kapitoly jen zčásti věcně spadá pod nadřazenou kapitolu 5.2 Rekurze nad databází: tisk hvězdiček ani výpočet faktoriálu s obsahem databáze nepracují.

Kap.5.4 Strukturní rekurze

V programech v této kapitole je z historických důvodů opakovaně používán problematický operátor "!" (řez), přestože by většinou bylo možné se jeho použití vyhnout.

Dodatek B: řešení cvičení č. 7

Ve skriptech je chybné označení proměnných. Správně má být:

naslednik(N,X) :-         findall(N0,mozny_naslednik(N0,X),[N|_]).
mozny_naslednik(N,X) :-         otec(X,N),muz(N).
mozny_naslednik(N,X) :-         manzelka(N,X).
mozny_naslednik(N,X) :-         otec(X,N),zena(N).

Dodatek B: řešení cvičení č. 11

Ve skriptech je chyba ve variantách 2 a 3. Správně má být:

Varianta 2 (chybné označení proměnných)

maximum([X],X).
maximum([X,Y|T],Max) :- X>Y,maximum([X|T],Max).
maximum([X,Y|T],Max) :- X=<Y, maximum([Y|T],Max).

Varianta 3 (predikát ifthenelse/3 nefunguje ve všech verzích)

maximum([X],X).
maximum([H|T],Max) :- maximum(T,Max0), (H>Max0 -> Max=H ; Max=Max0). 



Předmět Logické programování
Vojtěch Svátek - výuka
Vojtěch Svátek - hlavní stránka



Vojtěch Svátek , aktualizováno 7.10.2009