Kalábovi

Kalábovic wikina

Uživatelské nástroje

Nástroje pro tento web


msz:prolog

Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.

Odkaz na výstup diff

Obě strany předchozí revizePředchozí verze
Následující verze
Předchozí verze
msz:prolog [29. 05. 2012, 12.11:27] – [Operátor řezu] wiki pitelmsz:prolog [17. 08. 2026, 16.45:03] (aktuální) – odstraněno - upraveno mimo DokuWiki (Neznámé datum) 127.0.0.1
Řádek 1: Řádek 1:
-====== Prolog ====== 
-[[wp>Prolog]] 
  
-===== Principy ===== 
-**Programy jsou ze 2 častí:** 
-  * Vlastní program – Hornovy klauzule, které tvoří hypotetický základ pro důkaz. 
-  * Dotazy – cíle, predikáty, které chceme z dané hypotézy ověřit, zda platí nebo ne 
- 
-**Hornovy klauzule sa vyskytují ve 2 variantách:** 
-  * Fakta – např. ''ditetem(andulka, jan)''. 
-  * Plné klauzule s hlavou a tělem (pravidlo) – např. ''vnukem(X,Y) :- ditetem(X,Z), ditetem(Z,Y)''. 
- 
-**Struktura** 
-  * Termy – konstanty, proměnné, struktury 
-  * Klauzule 
-  * Cíle 
- 
-===== Vyhodnocování ===== 
-  * Vyhodnocování se provádí na základě [[wp>SLD resolution|SLD rezoluce]] – podcíle jsou expandované do hloubky. 
-  * Podcíle jsou v klauzili vyhodnocované zleva doprava. 
-  * Snaha unifikovat podcíl s hlavičkou faktu (klazule vložené do programu), potom je tělo této nalezené klauzule vyhodnocované zleva doprava a každý atom na pravé straně je zpracován do hloubky. 
-  * Při selhání se vykonává návar (backtracking). 
- 
-===== Unifikace ===== 
-Robinsonův unifikační algoritmus 
-  * Nevykonáva se kontrola výskytu (neodhalí sa např. ''X = f(X)'', což můze vést na nekonečný výsledný term)v 
-  * Základní a jediná operácia v Prologuv 
-  * Využití: 
-    * Přiřazení (navázání) hodnoty k nějaké proměnné: ''proměnná = hodnota''. 
-    * Test na rovnost (unifikovatelnost) termů (i složitějších struktur): ''term1 == term2'' 
-    * Výběr ze seznamu: ''L = [X|_]'' 
-    * Vytvýření struktur: ''Y = [a, b, c]'' 
-    * Předávání pararametry hodnotou (term je předaný jako skutečný argument) 
-    * Předávání parametru odkazem (proměnná je odevzdána jako skutečný argument) 
-    * Sdílení proměnných a vytváření synonym: ''a(P, Q) -> a(X, X)'' 
- 
-===== Vestavěné predikáty ===== 
-  * Vetšinou nejsou znovuspustitelné 
-  * Nevyhnutelné pro praktické programování 
-  * Aritmetické operace pomocí ''is'' 
-  * Testování typu – ''integer(X)'', ''atom(X)'' (''X'' je identifik8tor, konstanta) 
-  * Metalogické – test, zdaje proměnná navázaná ... 
-  * Operace s klauzulemi – dynamické přídávání (''assert'') a odebírání (//retract//) klauzulí 
- 
-===== Operátor řezu ===== 
-  * Právě jednou uspívající operátor 
-  * Pokud se program při backtrackingu dostane k operátoru řezu, selže celý podcíl a všechny body znovuuspění mezi hlavičkou kaluzule a operátorem řezu jsou zapomenuty. 
- 
-**Správné použití:** 
-  * chceme Prologu říct, že už se našlo hledané řešení a nemá cenu hledat dále (koncová podmínka): <code prolog>sum_to(1, 1) :- !. 
-sum_to(N, Res) :- N1 is N - 1, sum_to(N1, Res1), Res is Res1 + N.</code> 
-  * Bylo dosaženo stavu který už nevede k řešení – checeme aby podcíl selhal: <code prolog>not(P) :- call(P), !, fail. 
-not(P).</code> 
-  * Ukončení generování alternativních řešení: <code prolog>is_integer(0). 
-is_integer(X) :- is_integer(Y), X is Y + 1. 
-divide(N1, N2, Result) :- is_integer(Result), Product1 is Result * N2, Product2 is (Result + 1) * N2, Product1 =< N1, Product2 > N1, !.</code> 
- 
-**Nesprávné použití:** 
-  * Nesprávné použiyí může zamezit nelezení všech výsledků nebo nalezené chybných výsledků! 
-  * S operátorem řezu mají predikáty silně vymezený charakter podle toho u kterých parametrů můžou mít volnou proměnnou a kde je třeba mít hodnotu. 
/var/www/wiki/data/attic/msz/prolog.1338293487.txt.gz · Poslední úprava: (upraveno mimo DokuWiki)