W Prologu, czy ujednolicenie jest sposobem na uzyskanie nieskończonej listy?
To zależy od tego, czy uważasz za rozsądne stworzenie nieskończonej listy w ogóle. W ISO-Prolog unifikacja taka jak X = [1|X]
podlega kontroli (STO) i dlatego jest niezdefiniowana. Oznacza to, że program zgodny ze standardami nie może realizować takiego celu. Aby tego uniknąć, istnieje unify_with_occurs_check/2
, subsumes_term/2
. Aby chronić interfejsy przed otrzymywaniem nieskończonych warunków, istnieje acyclic_term/1
.
Wszystkie bieżące implementacje kończą się na X = [1|X]
. Również GNU Prolog kończy:
| ?- X = [1|X], acyclic_term(X).
no
Jednak w bardziej skomplikowanych przypadkach potrzebne jest racjonalne zjednoczenie drzew. Porównaj to z Haskellem, gdzie repeat 1 == repeat 1
powoduje zamrożenie.
Jeśli chodzi o używanie racjonalnych drzew w zwykłych programach Prologu, jest to dość interesujące na początku, ale nie rozszerza się bardzo dobrze.Przykładowo, przez jakiś czas sądzono, że na początku lat 80. XX wieku gramatyki będą wdrażane z użyciem drzew racjonalnych. Niestety, ludzie są zadowoleni z samych DCG. Jednym z powodów, dla których nie jest to pozostawienie badań, jest, ponieważ wiele pojęć programiści zakładają, że istnieją, nie istnieją dla drzew racjonalnych. Jako przykład można podać uporządkowanie terminów leksykograficznych, które nie ma rozszerzenia dla drzew racjonalnych. Oznacza to, że istnieją racjonalne drzewa, których nie można porównywać przy użyciu standardowej kolejności terminów. (Praktycznie oznacza to, że otrzymujesz quasi-losowe wyniki.) Oznacza to, że nie możesz utworzyć posortowanej listy zawierającej takie terminy. Co znowu oznacza, że wiele wbudowanych, takich jak bagof/3
, nie będzie działało niezawodnie z nieskończonymi terminami.
Dla przykładu zapytanie, należy rozważyć następującą definicję:
memberd(X, [X|_Xs]).
memberd(E, [X|Xs]) :-
dif(E,X),
memberd(E, Xs).
?- X = 1, Xs=[1|Xs], memberd(X,Xs).
X = 1,
Xs = [1|Xs] ;
false.
Więc czasami istnieją proste sposoby ucieczki non-zakończenie. Ale częściej niż nie ma ich wcale.