2016-06-04 13 views
3

Ich verstehe nicht, warum mein Prädikat nicht zurückgeht und alle Lösungen findet.Warum wird mein Prädikat nicht zurückverfolgt?

person(john). 
person(erik). 

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

Wenn ich dieses Prädikat mit zwei Variablen nennen:

allExceptSpider(person(Z),Q) 

Dann wird es nur geben Sie mir die Antwort Z = john, Q = [person (erik)] aber es wird nicht Rückzieher zu finden Z = erik, Q = [Person (John)] warum?

+1

Wegen subtrahieren/3 Unterschrift: +, +, -. Das zweite Argument sollte begründet sein. – CapelliC

+0

@ CapelliC. Mode-Spezifikationen sind schlampig. cf https://sicstus.sics.se/sicstus/docs/latest4/html/sicstus.html/Mode-Spec.html. IIRC "++" wird von einigen Prozessoren verwendet, um anzuzeigen, dass "geschliffen" werden sollte. – repeat

Antwort

3

TL; DR: Wenn Sie subtract/3 verwenden, verliert Ihr Code möglicherweise .

 
person(john). 
person(erik). 

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

Reinheit bewahren! Wie? Verwenden Sie list_item_subtracted/3 wie so:

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

Beispielabfragen head-to-head:

 
?- 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). 
Verwandte Themen