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.
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.
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]
.
V seznamu typů operátorů chybí část textu u páté odrážky, má tam být
,
, ;
, :-
a
?-
lze jako operátor zapisovat i Prologovskou negaci (jako not X
nebo \+ X
, viz kap. 4.5.5
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í.
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).
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í.
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.
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).
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).