我正在尝试为 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
“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
请注意:
nat/1
中不需要递归(除非目的是教简单的递归),可以只是:
nat(N) :-
integer(N),
N >= 0.