Prolog:在 gnu prolog 中加上?

问题描述 投票:0回答:2

我正在尝试为 Prolog 编写一个加号表达式。

使用 Prolog 艺术中的示例:

nat(0).
nat(N) :- N > 0, M is N - 1, nat(M).
plus(X, 0, X) :- nat(X).
plus(X, s(Y), s(Z)) :- plus(X, Y, Z).

然后我查询:

| ?- plus(1, 1, Y).

no

为什么这不是

Y = 2

我尝试了示例在这篇文章中,如下所示,结果类似:

peano_add(0, Sum, Sum).
peano_add(s(N), M, s(Sum)) :- peano_add(M, N, Sum).

| ?- peano_add(1, 1, Y).

no

prolog successor-arithmetics
2个回答
0
投票

“1”不是

1
,它是0的后继者。另外,现在另一个答案又混淆了这一点,因为“自然”应该这样定义(不是像书中那样吗??) ):

natural(0).
natural(s(X)) :- natural(X).

因此,按照您的示例中的定义,使用此和 plus/3,

plus(0, X, X) :- natural(X).
plus(s(X), Y, s(Z)) :- plus(X, Y, Z).

如果你想把1和1相加,因为1是0的后继,你必须写:

?- plus(s(0), s(0), X).

这应该回答

X = s(s(0))
,因为一加一等于二。您还可以使用此谓词进行减法。这是 GNU-Prolog 上的全部内容:

$ gprolog
GNU Prolog 1.4.5 (64 bits)
Compiled Dec 21 2020, 08:56:50 with gcc
By Daniel Diaz
Copyright (C) 1999-2020 Daniel Diaz
| ?- [user]. % define predicates
compiling user for byte code...
natural(0).
natural(s(X)) :- natural(X).
plus(0, X, X) :- natural(X).
plus(s(X), Y, s(Z)) :- plus(X, Y, Z).
end_of_file.
user compiled, 5 lines read - 673 bytes written, 17939 ms

(1 ms) yes
| ?- plus(s(0), s(0), X). % add 1 + 1

X = s(s(0))

yes
| ?- plus(s(0), X, s(s(s(s(0))))). % subtract 4 - 1

X = s(s(s(0)))

yes

-2
投票

请注意:

nat/1
中不需要递归(除非目的是教简单的递归),可以只是:

nat(N) :-
    integer(N),
    N >= 0.
© www.soinside.com 2019 - 2024. All rights reserved.