prolog - 如果 M 和 N 的差异大于 X,则序言中的谓词为真

标签 prolog successor-arithmetics

首先,我对 prolog 完全陌生,我正在尝试编写一个谓词 length(M,X,N),如果 M 与 N 的差异大于 X,则该谓词为真。

我编写了以下测试用例,如果 M(=dec.5) 和 N(=dec.2) 的差异大于 X(=dec.2),则该测试用例为真。在这种情况下也是如此,因为 5 和 2 的差值 3 大于 2:

?- length(s(s(s(s(s(0))))), s(s(0)), s(s(0))).
   true .

我知道 prolog 是递归工作的,所以我想知道我是否可以像在 C 语言中那样用条件(例如 <,>)构造这样的谓词,或者在 prolog 中是否有另一种方法可以做到这一点。很抱歉这个简单的问题,但我刚开始使用 prolog。

最佳答案

您可以为 greater 或 less 构造谓词。例如:

greater_than(s(_), 0).
greater_than(s(X), s(Y)) :-
    greater_than(X, Y).

类似地:

less_than(0, s(_)).
less_than(s(X), s(Y)) :-
    less_than(X, Y).

如果你想找到绝对差异,你可以这样做:

abs_diff(0, 0, 0).
abs_diff(s(X), 0, s(X)).
abs_diff(0, s(X), s(X)).
abs_diff(s(X), s(Y), D) :-
    abs_diff(X, Y, D).

这些概念应该有助于启动一些关于如何解决其余问题的想法。

关于prolog - 如果 M 和 N 的差异大于 X,则序言中的谓词为真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46862109/

相关文章:

prolog - SWI-Prolog 条件语句

prolog - 由 swi-prolog 编译的可以接受参数的 .exe 示例

prolog - Prolog 中的 CHR 解输出

haskell - Haskell 中实例化类型变量

coq - 如何在 Coq 中将 "+ 1"(加一)重写为 "S"(succ)?

prolog - 使用皮亚诺数字除法

prolog - 以非递归方式获取prolog中列表的长度

prolog - 可逆树长关系

recursion - 与 SUCC 的功能

prolog - 从谓词中收集所有 "minimum"解决方案