Recursion 从N到1递减列表

Recursion 从N到1递减列表,recursion,prolog,Recursion,Prolog,我试图制作一个谓词desclist(N,L)(N是一个自然数,L是一个自然数列表,从N到1降序排列)。此外,我不能使用is/2、元逻辑谓词、否定、失败、剪切等。。。纯逻辑编程。我有点不知道该怎么做。 我试过: desclist(s(0),[s(0)]). desclist(nat(X),[]). desclist(0,[]). desclist(X,[X|[R1|R2]]):- desclist(R1,[R1|R2]). 但是,正如你所看到的,这是一场完全没有意义的灾难哈哈。。。请帮助如果N是

我试图制作一个谓词desclist(N,L)(N是一个自然数,L是一个自然数列表,从N到1降序排列)。此外,我不能使用is/2、元逻辑谓词、否定、失败、剪切等。。。纯逻辑编程。我有点不知道该怎么做。 我试过:

desclist(s(0),[s(0)]).
desclist(nat(X),[]).
desclist(0,[]).
desclist(X,[X|[R1|R2]]):- desclist(R1,[R1|R2]).

但是,正如你所看到的,这是一场完全没有意义的灾难哈哈。。。请帮助如果
N
是一个自然数,那么
s(N)
是它的后继数。相反,如果
s(N)
是一个大于0的自然数,则
N
是它的前身。由于递归调用必须在解决问题的较小实例的情况下完成,因此可以执行以下操作:

desclist(0, []). % base case
desclist(s(N), [s(N)|L]) :- desclist(N, L). % step case
示例:

?- desclist(s(s(s(0))), L).
L = [s(s(s(0))), s(s(0)), s(0)].

?- desclist(N, [s(s(s(s(0)))), s(s(s(0))), s(s(0)), s(0)]).
N = s(s(s(s(0)))).