2016-06-04 2 views
3

왜 내 술어가 역 추적하지 않고 모든 솔루션을 찾지 못하는지 이해할 수 없습니다.내 술어가 왜 역 추적하지 않습니까?

person(john). 
person(erik). 

allExceptSpider(person(Spider),T):- 
    setof(person(X),person(X),S), 
    subtract(S,[person(Spider) ],T). 

내가 두 변수이 술어 호출하는 경우 : 다음

allExceptSpider(person(Z),Q) 

에게 그것은 단지 나에게 응답 Z = 존을 줄 것이다, Q는 = [사람 (에릭)] 하지만 철수하지 않을 것이다 찾으려면 Z = erik, Q = [사람 (존)] 왜?

+1

때문에 빼기/3 서명의 : +, +, -. 두 번째 인수는 반드시 그라운드되어야합니다. – CapelliC

+0

@ CapelliC. 모드 사양이 엉성함. cf https://sicstus.sics.se/sicstus/docs/latest4/html/sicstus.html/Mode-Spec.html. IIRC "++"는 "처리해야 함"을 나타내는 일부 프로세서에서 사용됩니다. – repeat

답변

3

TL :subtract/3을 사용하면 코드가 이 될 수 있습니다.

 
person(john). 
person(erik). 

allExceptSpider(Spider, T) :- 
    setof(X, person(X), S), 
    subtract(S, [Spider], T). 

순도 유지! 어떻게? 과 같이 list_item_subtracted/3을 사용

 
allExceptSpiderNU(Spider, T) :- 
    setof(X, person(X), S), 
    list_item_subtracted(S, Spider, T). 

샘플 쿼리 헤드 - 투 - 헤드 :

 
?- allExceptSpider(Z, Q). 
Q = [erik], Z = john. 

?- allExceptSpiderNU(Z,Q). 
    Q = [  erik]    ,  Z=john 
; Q = [john  ],  Z=erik 
; Q = [john,erik], dif(Z,erik), dif(Z,john).