Return 与 Prolog 的整数
Return Integer with Prolog
我现在试着理解序言。我想给出输入:convert(s(s(s(X))),Y)
输出应该是 Y = 3
.
convert(s(0), 1).
convert(s(s(0)), 2).
convert(s(X),Y) :- convert(X,Y is (Y+1)).
这些是我现在的规则,但只是输入:
convert(s(0), 1)
。和
convert(s(s(0)), 2)
。工作。
如果我的递归能正常工作,我就不需要规则:convert(s(s(0)), 2)
。
有人可以帮我解决这个问题吗?
这里有两个问题:
Y is Y+1
,在 Prolog 中没有任何意义;和
- 注意你这里实际上写了一个仿函数.
Prolog 将此视为调用:
convert(X,is(Y,Y+1))
其中 is(Y,Y+1)
未被 调用,但作为函子传递。在 Prolog 中没有明确的输入和输出。你调用谓词并通过统一,你得到结果。
不过我们可以通过递归来解决这个问题:0
的convert/2
当然是0
:
convert(0,0).
和s(X)
的转换,是X
加一的转换:
convert(s(X),R) :-
convert(X,Y),
R is Y+1.
或者把这些放在一起:
convert(0,0).
convert(s(X),R) :-
convert(X,Y),
R is Y+1.
现在我们可以调用谓词列出所有Peano数和对应的数,以及将Peano数转换为数字。我们还可以验证 Peano 数是否为正常数。
不幸的是,我们不能使用此谓词从给定数字中获取 Peano 数:它将与 Peano 数统一,但试图寻找另一个 Peano 数时,将陷入无限循环。
我们可以使用 clpfd
库来帮助我们:
:- use_module(library(clpfd)).
convert(0,0).
convert(s(X),R) :-
<b>R #> 0,
Y #= R-1,</b>
convert(X,Y).
我现在试着理解序言。我想给出输入:convert(s(s(s(X))),Y)
输出应该是 Y = 3
.
convert(s(0), 1).
convert(s(s(0)), 2).
convert(s(X),Y) :- convert(X,Y is (Y+1)).
这些是我现在的规则,但只是输入:
convert(s(0), 1)
。和
convert(s(s(0)), 2)
。工作。
如果我的递归能正常工作,我就不需要规则:convert(s(s(0)), 2)
。
有人可以帮我解决这个问题吗?
这里有两个问题:
Y is Y+1
,在 Prolog 中没有任何意义;和- 注意你这里实际上写了一个仿函数.
Prolog 将此视为调用:
convert(X,is(Y,Y+1))
其中 is(Y,Y+1)
未被 调用,但作为函子传递。在 Prolog 中没有明确的输入和输出。你调用谓词并通过统一,你得到结果。
不过我们可以通过递归来解决这个问题:0
的convert/2
当然是0
:
convert(0,0).
和s(X)
的转换,是X
加一的转换:
convert(s(X),R) :-
convert(X,Y),
R is Y+1.
或者把这些放在一起:
convert(0,0).
convert(s(X),R) :-
convert(X,Y),
R is Y+1.
现在我们可以调用谓词列出所有Peano数和对应的数,以及将Peano数转换为数字。我们还可以验证 Peano 数是否为正常数。
不幸的是,我们不能使用此谓词从给定数字中获取 Peano 数:它将与 Peano 数统一,但试图寻找另一个 Peano 数时,将陷入无限循环。
我们可以使用 clpfd
库来帮助我们:
:- use_module(library(clpfd)).
convert(0,0).
convert(s(X),R) :-
<b>R #> 0,
Y #= R-1,</b>
convert(X,Y).