Unifikacja i programowanie logiczne

Unifikacja

Proces znajdowania rozwiązań zbioru równań symbolicznych.

Wyrażenie symboliczne = term

Term = atom | zmienna | relacja

Syntaktyczna / semantyczna

Substytucja

Rozwiązaniem problemu unifikacji jest substytucja, czyli mapowanie zmiennych równania do termów.

Formalnie: substytucja to iniekcja σ: VT pomiedzy pewnym zbiorem zmiennych V a zbiorem termów T

Często używana notacja: { x1 ↦ t1, ..., xktk }

Substytucja

Aplikacja substytucji σ = { x1 ↦ t1, ..., xktk } do termu t (zapisywane jako tσ) oznacza jednoczesne zastąpienie każdego wystąpienia zmiennej xi w t przez ti.

Powstały w ten sposób term t` nazywamy instancją termu t

Unifikacja cd...

Algorytm unfikacji powinien szukać najbardziej ogólnego unifikatora (mgu) tj. substytucji rozwiązującej problem która jest:

- zupełna tj. zawiera wszystkie rozwiązania

- minimalna tj. nie ma reduntantnych elementów

- każde inne rozwiązanie u można przedstawić w postaci u dla każdego termu t w σ

Problem unifikacji może oczywiście nie mieć rozwiązań, bądź, w ogólności, nie mieć skończonego rozwiązania (!) etc.

Unifikacja cd...

Unifikacja - zastosowania

Automatyczne wnioskowanie

Systemy regułowe/eksperckie

Programowanie logiczne (Prolog, Miranda)

Inferencja typów

Przepisywanie termów (rachunek lambda, Haskell !)

Prolog

1. Zmienna wolna (niezunifikowana) unifikuje się z dowolnym termem

2. Dwa atomy unifikują się z sobą jeśli są identyczne

3. Funktory unifikują się z sobą jeśli ich nazwy i krotności są identyczne i parametry są rekurencyjnie unifikowalne

Inferencja

1. Zmienna typu (niezunifikowana) unifikuje się z dowolnym wyrażeniem

2. Dwa typy unifikują się z sobą jeśli są identyczne

3. Konstruktory typu unifikują się z sobą jeśli ich nazwy i krotności są identyczne i typy składowe są rekurencyjnie unifikowalne

Unifikacja syntaktyczna / programowanie logiczne

fallible(X) :- human(X).

human(socrates).

fallible(socrates)?

 

System nie musi rozumieć co znaczy 'omylny', 'człowiek' czy 'Sokrates' :-).

Algorytm Robinsona (1965)

G ∪ { tt } ⇒ G     delete

G ∪ { f(s0,...,sk) ≐ f(t0,...,tk) } ⇒ G ∪ { s0 ≐ t0, ..., sktk }     decompose

G ∪ { f(s0,...,sk) ≐ g(t0,...,tm) } ⇒ ⊥ if fg or km     conflict

G ∪ { f(s0,...,sk) ≐ x } ⇒ G ∪ { xf(s0,...,sk) }     swap

G ∪ { xt } ⇒ G{xt} if xvars(t) and xvars(G)     eliminate

G ∪ { xf(s0,...,sk) } ⇒ ⊥ if xvars(f(s0,...,sk))     check

Prolog

PROLOG = unifikacja + backtracking

 

Program w Prologu =

fakty - cat(tom).

reguły - Head :- Body

zapytania - ?- cat(tom)

Prolog

Reguły muszą być w postaci klauzul Horna tj. klauzul (dysjunkcji termów), które zawierają co najwyżej jeden niezanegowany term.

Przykłady: https://en.wikipedia.org/wiki/Horn_clause#Definition

Dlaczego? Spełnialność jest problemem P-zupełnym dla klauzul Horna, w ogólnym przypadku NP-zupełnym (ekwiwalentnym do 3SAT), bez zmniejszenia ekspresywności == uniwersalnej maszynie Turinga

Prolog

Let's code an Interpreter

 

tap2

By Marcin Rzeźnicki

tap2

Unifikacja i programowanie logiczne

  • 924