Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
| Obě strany předchozí revizePředchozí verzeNásledující verze | Předchozí verze | ||
| msz:prolog [29. 05. 2012, 12.11:27] – [Operátor řezu] wiki pitel | msz: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> | ||
| - | ===== 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ř. '' | ||
| - | * Plné klauzule s hlavou a tělem (pravidlo) – např. '' | ||
| - | |||
| - | **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ř. '' | ||
| - | * Základní a jediná operácia v Prologuv | ||
| - | * Využití: | ||
| - | * Přiřazení (navázání) hodnoty k nějaké proměnné: '' | ||
| - | * Test na rovnost (unifikovatelnost) termů (i složitějších struktur): '' | ||
| - | * Výběr ze seznamu: '' | ||
| - | * Vytvýření struktur: '' | ||
| - | * 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: '' | ||
| - | |||
| - | ===== Vestavěné predikáty ===== | ||
| - | * Vetšinou nejsou znovuspustitelné | ||
| - | * Nevyhnutelné pro praktické programování | ||
| - | * Aritmetické operace pomocí '' | ||
| - | * Testování typu – '' | ||
| - | * Metalogické – test, zdaje proměnná navázaná ... | ||
| - | * Operace s klauzulemi – dynamické přídávání ('' | ||
| - | |||
| - | ===== 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(N, Res) :- N1 is N - 1, sum_to(N1, Res1), Res is Res1 + N.</ | ||
| - | * Bylo dosaženo stavu který už nevede k řešení – checeme aby podcíl selhal: <code prolog> | ||
| - | not(P).</ | ||
| - | * Ukončení generování alternativních řešení: <code prolog> | ||
| - | is_integer(X) :- is_integer(Y), | ||
| - | divide(N1, N2, Result) :- is_integer(Result), | ||
| - | |||
| - | **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. | ||