[prolog] 쿼리에서 중복 목표 사용

합니다 (시 @repeat의 제안 (A)의 쿼리 고려) 순수 프로그램 1 ?- G_0. 쿼리가 무슨 소용있는 경우를 것 ?- G_0, G_0.있나요?

각주
1 태 블링이 없으며 (안전하게) 구속 조건이 정상입니다. 주제에 대한
이전 게시물 .



답변

이 쿼리는 ?- G_0, G_0.중복 응답을 식별하는 데 도움이됩니다.?- G_0.

그것의 답변의 수를 비교하기에 충분 그렇게 할 ?- G_0.의 답변의 수를 ?- G_0, G_0.. 이러한 답변을 저장할 필요가 없습니다 (어쨌든 오류의 빈번한 원인입니다). 두 정수만으로 충분합니다! 동일하면 중복성이 없습니다. 그러나 ?- G_0, G_0.더 많은 답변이 있으면 약간의 중복성이 있습니다. 예를 들면 다음과 같습니다.

p(f(_,a)).
p(f(b,_)).

?- p(X).
   X = f(_A, a)
;  X = f(b, _A).  % two answers

?- p(X), p(X).
   X = f(_A, a)
;  X = f(b, a)
;  X = f(b, a)
;  X = f(b, _A).   % four answers
                   % thus p(X) contains redundancies

… 이제 고치겠습니다 :

p(f(B,a)) :-
   dif(B, b).
p(f(b,_)).

?- p(X).
   X = f(_A, a), dif(_A, b)
;  X = f(b, _A).

?- p(X), p(X).
   X = f(_A, a), dif(_A, b), dif(_A, b).
;  X = f(b, _A).    % again two answers, thus no redundancy

관련된 제약 조건을 수동으로 검사 할 필요가 없습니다.

이를 사용하여 중복 답변을 명시 적으로 검색하는 경우 더 확장 할 수 있습니다 call_nth/2.

?- G_0, call_nth(G_0, 2).


답변

순수한 program1?-G_0의 쿼리를 고려하십시오. 쿼리가 있으면 어떻게 사용합니까?-G_0, G_0. 있다?

특히 꼬리 재귀 최적화 ( 마지막 호출 최적화 )가 ON 인 경우 두 번째 목표의 유용성이 없습니다 .

쿼리가 리소스가 많고 위의 옵션이 꺼져 있을 때 (예 : 디버깅) GC 문제 (스택 / 힙 오버플로)를 알 수 있습니다 .

두 번째 호출은 중복되어 (순수한 프로그램의 경우) 컴파일러에서 제거해야한다고 생각합니다.


답변