(Za sugestią @repeat ) Zastanów się nad zapytaniem czystego programu 1 ?- G_0.
Jaki użytek z tego miałoby zapytanie ?- G_0, G_0.
?
Przypisy
1 Brak tablicowania (dla bezpieczeństwa), ograniczenia są OK.
Poprzedni post na ten temat.
prolog
logical-purity
fałszywe
źródło
źródło
?- G_0(State), G_0(State).
również na stosie nie jest przekazywany stan od wyniku pierwszego gola do drugiego gola?G_0
może być dowolny (czysty) cel, w tym, powiedzmyG_0 = append(Xs,Ys,Zs)
G_0;G_0
jednym można przetestować działania niepożądane lub problemy z wydajnością / buforowaniem / tabelowaniem)G_0(State),G_0(State)
jednego raczej piszecall(G_1,State), call(G_1,State)
Odpowiedzi:
Zapytanie
?- G_0, G_0.
pomaga zidentyfikować zbędne odpowiedzi?- G_0.
Aby to zrobić, wystarczy porównać liczbę odpowiedzi
?- G_0.
z liczbą odpowiedzi z?- G_0, G_0.
. Nie trzeba przechowywać tych odpowiedzi (co i tak jest częstym źródłem błędów). Wystarczy dwie liczby całkowite! Jeśli są równe, nie ma redundancji. Ale jeśli?- G_0, G_0.
ma więcej odpowiedzi, istnieje pewna redundancja. Oto przykład:... a teraz naprawmy to:
Nie trzeba ręcznie sprawdzać związanych z tym ograniczeń.
Można to dodatkowo rozszerzyć, gdy wyraźnie szukamy zbędnych odpowiedzi tylko przy użyciu
call_nth/2
.źródło
Nie widzę żadnej przydatności drugiego celu, zwłaszcza gdy włączona jest optymalizacja rekurencji ogona ( optymalizacja ostatniego połączenia ) .
Mógłbym zrozumieć problem GC (przepełnienie stosu / sterty), gdy zapytanie jest zachłanne na zasoby i powyższe opcje są WYŁĄCZONE (np. Podczas debugowania).
Myślę, że drugie wywołanie jest redundantne (dla czystego programu) i powinno zostać wyeliminowane przez kompilator.
źródło