我有一个谓词可以生成这样的子列表,
?- 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.当我使用变量而不是常量来调用它时,它们与#统一在一起,破坏了输出,并阻止了它们以后的统一。我如何才能阻止变量与#统一,像这样?
发布于 2020-05-02 18:35:45
停止变量与#的统一
只有当您的Prolog支持dif/2 (SWI-Prolog支持)时,这才是可用的常规方法。
?- f(..., L), maplist(dif(#), L).当然,在您的代码中可能有更好的位置来放置dif/2调用,或者您可以使用标准ISO操作符(\==)/2来避免统一。这种策略是否可行,最大程度上取决于你的代码。一般来说,从效率的角度来看,当我们给他们一个机会尽快限制搜索空间时,约束会起到更好的作用。
https://stackoverflow.com/questions/61557633
复制相似问题