我正在学习Prolog,尤其是我专注于列表。
给出一个数字n
,从0
到n
返回一个数字列表。
例如,给定2
,输出将为[0,1,2]
这是我的代码:
num2list(0,[0]).
num2list(X,[H|T]) :-
H is X,
N is X-1,
num2list(N,T).
num2list(2,X)
的输出为X=[2,1,0].
也许解决方案很愚蠢,但是我找不到办法。我试图对我的代码进行一些修改,但是我只得到了错误。
这个程序是我的,我不想使用诸如“ in”之类的标准谓词,因为我不知道并且我想进行纯递归。
那么执行此操作的简单方法是什么?
我在书中看到它是这样做的,我想保持这种方式。
答案 0 :(得分:5)
您想要一个具有升序的列表,但谓词定义是按降序构造它。对于这个问题,有不止一个明智的解决方案,包括使用事实上的标准谓词,例如between/3
。一种与您尝试的解决方案接近的解决方案是使用其他参数:
num2list(N, List) :-
num2list(0, N, List).
num2list(N, N, [N]).
num2list(N0, N, [N0| List]) :-
N0 < N,
N1 is N0 + 1,
num2list(N1, N, List).
通话示例:
?- num2list(2, L).
L = [0, 1, 2] ;
false.
这个特殊解决方案的一个问题是虚假的选择点,您可以在示例调用中注意到。您的代码中也存在此问题。通过使用cut或if-then-else构造,可以使用较少声明性的解决方案轻松解决该问题。