쿼리에서 중복 목표 사용


12

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

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


결과 수를 제곱?
Willem Van Onsem

1
목표의 연속 실행에서 상태 정보가 보존되지 않는다고 생각합니다. 즉, 질문의 변형이 허용되지 않습니다. 예를 들어 ?- G_0(State), G_0(State)., 첫 번째 목표의 결과에서 두 번째 목표로 스택에 상태가 전달되지 않습니까?
Guy Coder

1
G_0다음과 같은 (순수한) 목표 일 수 있습니다.G_0 = append(Xs,Ys,Zs)
거짓

1
@GuyCoder : 연결이 필요합니다. (와 G_0;G_0하나의 힘 테스트 부작용이나 성능 / 캐시 / tabeling 문제)
거짓

1
BTW, G_0(State),G_0(State)하나 대신 쓰기call(G_1,State), call(G_1,State)
거짓

답변:


3

이 쿼리는 ?- 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).

1

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

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.