different(Xs, Ys) :-
member(X, Xs),
non_member(X, Ys).
different(Xs, Ys) :-
member(Y, Ys),
non_member(Y, Xs).
尽管从声明的 Angular 来看,使用
member/2
和 non_member/2
的定义几乎是完美的,但它为某些查询提供了冗余的解决方案,并且到处都是选择点。对此有什么改进的定义(可能纯粹使用
if_/3
和 (=)/3
),使得different/2
描述了完全相同的解决方案集,但至少对于地面查询是确定的(因此,不会留下任何无用的选择点)并省略(如果可能)任何多余的答案?1个
实际上,
different([a|nonlist],[]), different([],[b|nonlist])
成功。它同样可能失败。因此,对于两者都失败的解决方案就可以了(也许更好)。
最佳答案
让我们将其发挥到极致-借助 list_nonmember_t/3
, exists_in_t/3
和
or_/2
!
some_absent_t(Xs,Ys,Truth) :-
exists_in_t(list_nonmember_t(Ys),Xs,Truth).
different(Xs,Ys) :-
or_(some_absent_t(Xs,Ys),
some_absent_t(Ys,Xs)).
关于prolog - different/2-是否存在纯粹的确定性定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30863784/