prolog - 如何阻止序言无限地检查不可能的解决方案?

标签 prolog backtracking logic-programming failure-slice successor-arithmetics

假设有以下程序:

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/

相关文章:

algorithm - 如何使用回溯法求解 M<N 时的 M 个皇后

prolog - 正确使用逻辑语言作为工具

Prolog - 证明树错过了可能性

Prolog编程——简单否定查询

algorithm - 解决 N 皇后问题……我们能走多远?

Python 回溯字符串长度 n 来自字母表 {a,b,c} 与 #a=#b

algorithm - 如何计算回溯的空间复杂度?

database - 什么是 clojure 中用于逻辑编程的好的/已建立的数据库支持策略

variables - 检查变量是否为空或已填充

logic - 关系从句逻辑问题:什么是赫布兰德解释