【发布时间】:2015-09-01 01:08:26
【问题描述】:
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 的定义从声明的角度来看几乎1完美,但它为某些查询产生了冗余解决方案并留下了选择点。
什么是对此进行改进的定义(以纯粹的方式可能使用if_/3 和(=)/3),使得different/2 描述了完全相同的一组解决方案,但至少对于地面查询是确定的(因此不会留下任何无用的选择点)并省略(如果可能)任何多余的答案?
1
实际上,different([a|nonlist],[]), different([],[b|nonlist]) 成功了。它同样可能失败。因此,两者都失败的解决方案很好(甚至更好)。
【问题讨论】:
-
我们是在谈论 lists 还是 sets,因为这可能会产生一些影响(尤其是在效率方面)。
-
@CommuSoft:我完全避免提及这些密切相关的概念,以便更好地关注实际定义。当然,目的是表示集合,但这种知识不应该改变任何东西。无论如何,是可能有重复的!
-
此外,这个谓词似乎做了太多工作:使用
different([a,b],Y).查询时,它给出:Y = [_G122], dif(_G122, a) ;,但dif(_G122,a);不是必需的:即使它等于@ 987654335@,这不是问题。当然,如果查询different([a,b],[Y]),则会得到dif(Y,a)、dif(Y,b)和dif(Y,b),dif(Y,a),但这仍然没有必要。 -
@CommuSoft:到目前为止,我还没有考虑过那种级别的冗余。我完全被地面查询的低效率所吸引。因此,如果你成功地找到了一个考虑到这一点的纯粹定义——那就更好了!有很多赏金:-)
标签: prolog prolog-dif logical-purity