在prolog中反转简单列表

在prolog中反转简单列表,prolog,Prolog,以下代码将对prolog中的列表执行反向操作: rev([], []). rev([X|Xs], Ys) :- rev(Xs, Zs), append(Zs, [X], Ys). 我不知道它为什么会起作用,虽然我理解以下内容,但我希望进一步澄清 基本情况表明,空列表将导致空列表 我不知道这之后发生了什么。为什么要调用append函数 第一步是理解append(Zs[X],Ys)何时为真。它说:当您将项[X]添加到列表Zs的末尾时,结果等于Ys,这是正确的 当Zs是Xs的反向列表时,rev(Xs

以下代码将对prolog中的列表执行反向操作:

rev([], []).
rev([X|Xs], Ys) :- rev(Xs, Zs), append(Zs, [X], Ys).
我不知道它为什么会起作用,虽然我理解以下内容,但我希望进一步澄清

基本情况表明,空列表将导致空列表


我不知道这之后发生了什么。为什么要调用append函数

第一步是理解
append(Zs[X],Ys)
何时为真。它说:当您将项
[X]
添加到列表
Zs
的末尾时,结果等于
Ys
,这是正确的

Zs
Xs
的反向列表时,
rev(Xs,Zs)
为真

因此,当您反转列表
Xs
并将
[X]
附加到反转列表的末尾时,整个算法表示
Ys
[X|Xs]
的反转列表

在某些过程语言中,您可以使用以下代码编写相同的算法:

function List<T> Reverse(List<T> items)
{
    if (items.Count == 0)
         return items;

    var reversedList = Reverse(items.Skip(1));
    reversedList.Add(items.First());
    return reversedList;
} 
功能列表反向(列表项)
{
如果(items.Count==0)
退货项目;
var reversedList=反向(项目跳过(1));
添加(items.First());
返回反向列表;
} 

为什么有人否决了你的答案?我有点明白你的意思,所以这是在prolog中反转列表的唯一方法吗?。投票通过并接受了答案。我也不知道。。。不,还有其他方法可以反转列表。还有更有效的算法,您发布的算法可能是最幼稚的,但很容易理解,尤其是当您刚刚接触Prolog时。