different(Xs, Ys) :-
member(X, Xs),
non_member(X, Ys).
different(Xs, Ys) :-
member(Y, Ys),
non_member(Y, Xs).
Хотя это определение с помощью member/2
и non_member/2
почти совершенных с декларативной точки зрения, это создает избыточные решения для определенных запросов и оставляет выбор точек вокруг.разные/2 - существует ли чистое, детерминированное определение?
Что такое определение, которое улучшает на этом (в чистом образом, возможно, с использованием if_/3
и (=)/3
), что точно такой же набор решений описывается different/2
, но является детерминированным по крайней мере, для наземных запросов (таким образом, не оставляет бесполезно пункты выбора открыты) и опускает (если возможно) любой избыточный ответ?
На самом деле, different([a|nonlist],[]), different([],[b|nonlist])
успешно. Это может также потерпеть неудачу. Таким образом, решение, которое не подходит для обоих, прекрасно (возможно, даже более тонкое).
мы говорим о * списки * или * наборы *, потому что это может иметь определенные последствия (особенно в отношении эффективности). –
@CommuSoft: Я избегал упоминать эти близко связанные понятия, чтобы лучше сосредоточиться на фактическом определении. Разумеется, намерение состояло бы в том, чтобы представлять множества, но это знание не должно ничего менять. В любом случае, ** возможно наличие дубликатов! – false
Кроме того, этот предикат, кажется, выполняет слишком много работы: при запросе с помощью 'different ([a, b], Y) .' он дает:' Y = [_G122], dif (_G122, a); ', но 'dif (_G122, a);' не требуется: даже если он равен 'a', это не проблема. Конечно, если один запрос для 'different ([a, b], [Y])', то получается 'dif (Y, a)', 'dif (Y, b)' и 'dif (Y, b), dif (Y, a) ', но все же это необязательно. –