different(Xs, Ys) :-
member(X, Xs),
non_member(X, Ys).
different(Xs, Ys) :-
member(Y, Ys),
non_member(Y, Xs).
Während diese Definition member/2
und non_member/2
ist fast perfekt aus einer deklarativen Sicht verwendet wird, erzeugt es redundante Lösungen für bestimmte Abfragen und Blätter, die alle um Wahl Punkte.anders/2 - existiert eine reine, bestimmte Definition?
Was eine Definition, die (in einer reinen Weise wahrscheinlich if_/3
und (=)/3
verwendet) auf diese verbessert, so dass genau den gleichen Satz von Lösungen von different/2
beschrieben wird, ist aber zumindest für Boden Abfragen bestimmt (also keine nutzlosen nicht verlassen Wahl Punkte offen) und (wenn möglich) jede überflüssige Antwort weglässt?
Tatsächlich gelingt es different([a|nonlist],[]), different([],[b|nonlist])
. Es könnte ebenso scheitern. Eine Lösung, die für beide fehlschlägt, ist in Ordnung (vielleicht sogar feiner).
Sprechen wir über * Listen * oder * * setzen, weil diese einige Auswirkungen haben kann (vor allem in Bezug auf Effizienz). –
@CommuSoft: Ich vermied es, diese eng verwandten Begriffe vollständig zu erwähnen, um mich besser auf die eigentliche Definition zu konzentrieren. Natürlich wäre es Absicht, Mengen darzustellen, aber dieses Wissen sollte nichts ändern. In jedem Fall ist es ** möglich, Duplikate zu haben! – false
Außerdem scheint dieses Prädikat etwas zu viel Arbeit zu verrichten: wenn man mit 'different ([a, b], Y).' Abfragt, gibt es: Y = [_G122], dif (_G122, a); ', aber das 'dif (_G122, a);' ist nicht notwendig: selbst wenn es gleich 'a' ist, ist das kein Problem. Wenn man natürlich nach "different ([a, b], [Y])" fragt, erhält man "dif (Y, a)", "dif (Y, b)" und "dif (Y, b), dif (Y, a) ', aber das ist immer noch nicht notwendig. –