Prolog:返回给定N的从0到N的数字列表

the*_*omc 1 recursion list 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).
Run Code Online (Sandbox Code Playgroud)

输出num2list(2,X)X=[2,1,0].

也许解决方案是愚蠢的,但我找不到办法.我试图对我的代码进行一些修改,但我只是得到了错误.

这个程序是我的,我不想使用像"in"之类的标准谓词,因为我不知道,我想做一个纯粹的递归.

那么这是一个简单的方法呢?

我在书中看到这样做,我希望保持这种方式.

Pau*_*ura 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).
Run Code Online (Sandbox Code Playgroud)

示例电话:

?- num2list(2, L).
L = [0, 1, 2] ;
false.
Run Code Online (Sandbox Code Playgroud)

这个特定解决方案的一个问题是虚假选择点,您可以在示例调用上注意到这一点.此问题也存在于您的代码中.通过使用cut或if-then-else结构,可以使用较少声明性的解决方案轻松解决它.