我有一个谓词,可以生成这样的子列表。
?- f([1,2,3,#,5,6,7,8,#,10,11,12],L).
L = [1,2,3];
L=[5,6,7,8];
L=[10,11,12];
false.
当我用变量而不是常量来调用它时,它们就会与#统一起来,破坏输出,并阻止它们以后统一起来。我怎样才能阻止变量和#统一起来呢?
停止变量与#的统一
这是一般的方法,只有当你的Prolog支持dif2时才可以使用(SWI-Prolog支持),当然在你的代码中可以有一些更好的地方放置dif2调用,或者你可以使用标准的ISO运算符(\==)2来避免统一。
?- f(..., L), maplist(dif(#), L).
当然,在你的代码中可以有更好的地方来放置dif2调用,或者你可以使用标准的ISO操作符(\==)2来避免统一。这样的策略是否可行,主要取决于你的代码。一般来说,当我们给约束条件限制搜索空间的机会时,从效率的角度来看,约束条件的效果会更好。尽快.