Co to oznacza w Prologu porównywanie predykatu z niezwiązaną zmienną?Co robi Prolog, jeśli X = f (X)?
Odpowiedz
Wynik celu X = f(X)
zależy od implementacji Prolog, W niektórych systemach, jak wskazał Carlo w swojej odpowiedzi, wynik może być kontrolowany przez flagę ustawialną przez użytkownika. Predykat unifikacji, (=)/2
, może być zaimplementowany z lub bez tego, co nazywa się sprawdzaniem. Ta weryfikacja sprawdza, czy zmienna w jednym operandzie występuje w podpowiedzi w drugim operandzie. Kiedy predykat unifikacji implementuje tę kontrolę, cel X = f(X)
ulega awarii. Jednak ze względu na wydajność, predykat unifikacji jest często wdrażany bez tej kontroli. Norma ISO Prolog określa alternatywny predykat unifikacji o trafnej nazwie unify_with_occurs_check/2
, który może być używany, gdy cele takie jak ta mogą prowadzić do problemów.
Obecnie kilka implementacje obsługują cykliczne warunki, znany również jako racjonalnych kategoriach, które są tworzone przez cele, takie jak X = f(X)
. Należą do nich CxProlog, ECLiPSe, SICStus Prolog, SWI-Prolog i YAP. Należy jednak pamiętać, że poziom wsparcia dla terminów racjonalnych jest różny w różnych systemach. Minimalne wsparcie będzie (1), aby móc tworzyć racjonalne terminy (bez przepełnienia stosu!), (2), aby móc ujednolicić dwa racjonalne terminy, oraz (3) aby móc drukować powiązania zapytań, które zawierają racjonalne terminy w sposób niejednoznaczny. Dzięki tym trzem funkcjom możesz np. implementować programowanie logiczne koincypcyjne, które przyda się w kilku klasach problemów.
W Prologu, (=)/2 to nie porównanie, ale operacja podstawowa, o nazwie unification.
Wyrażenie wyświetlane w tytule pytania, jeśli zostanie wywołane, gdy X jest zmienną wolną, utworzy cykliczny cykliczny. W SWI-Prolog
?- X=f(X),write(X).
@(S_1,[S_1=f(S_1)])
X = f(X).
terminy cykliczne są problematyczne w obsłudze, zazwyczaj są tworzone przez błędów programistycznych: zachowanie SWI-Prologu (i inne) mogą być sterowane za pomocą globalnej flagi, zobacz occurs_check.