假设有以下程序:
nat(0).
nat(s(N)) :- nat(N).
/* 0+b=b */
plus(0,B,B) :- nat(B).
/* (a+1)+b = c iff a+(b+1)=c */
plus(s(A),B,C) :- plus(A,s(B),C).
它非常适合添加两个数字,但是当我尝试以下类型的查询时:
plus(Z,Z,s(0)).
它继续搜索
Z
的可能值很久之后应该很明显没有解决方案(即 Z>s(0)
)我熟悉 cut(
!
) 运算符,我的直觉说解决方案与它有关,我只是不确定在这种情况下如何使用它。
最佳答案
!/0
对于此类问题,始终不是一个好的解决方案。对于更一般的查询,它通常会导致丢失有效的解决方案。
相反,请考虑使用有限域约束,在这种情况下效果很好:
?- use_module(library(clpfd)).
true.
?- Z + Z #= 0.
Z = 0.
?- Z + Z #= 0, Z #> 0.
false.
编辑 :根据要求,不带 CLP(FD) 的可能解决方案:
plus(0, Y, Y).
plus(s(X), Y, s(Z)) :- plus(X, Y, Z).
关于prolog - 如何阻止序言无限地检查不可能的解决方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22594363/