序言:给定N,返回从0到N的数字列表

时间:2019-01-28 11:56:59

标签: list recursion prolog

我正在学习Prolog,尤其是我专注于列表。

给出一个数字n,从0n返回一个数字列表。

例如,给定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”之类的标准谓词,因为我不知道并且我想进行纯递归。

那么执行此操作的简单方法是什么?

我在书中看到它是这样做的,我想保持这种方式。

1 个答案:

答案 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构造,可以使用较少声明性的解决方案轻松解决该问题。

相关问题