prolog - different/2-是否存在纯粹的确定性定义?

标签 prolog prolog-dif logical-purity

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/

相关文章:

Prolog谓词定义为2个目标的 bool OR?

prolog - 所有可达节点的祖先

prolog - SWI-Prolog 中正确的 unify_with_occurs_check/2?

list - Prolog:检查列表中的重复项

prolog - Pure Prolog Peano Number Apartness

prolog - 纯prolog小程序源码

lambda - Prolog 中的括号抽象

prolog - Prolog 中的奇怪运算符 (!)

prolog - "almost pure"Prolog 有表达力吗?