합니다 (시 @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 문제 (스택 / 힙 오버플로)를 알 수 있습니다 .
두 번째 호출은 중복되어 (순수한 프로그램의 경우) 컴파일러에서 제거해야한다고 생각합니다.