在prolog中反转一个简单的列表

时间:2014-12-04 23:58:54

标签: prolog

以下代码将在prolog列表中执行反向:

rev([], []).
rev([X|Xs], Ys) :- rev(Xs, Zs), append(Zs, [X], Ys).

我不知道为什么会有效,虽然以下是我的理解,但我希望进一步澄清。

基本情况表明空列表会导致空列表。

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

1 个答案:

答案 0 :(得分:0)

第一步是了解append(Zs, [X], Ys)何时为真。它说:当您将项目[X]添加到列表Zs的末尾并且结果等于Ys时,确实如此。

如果rev(Xs, Zs)Zs的反转列表,则Xs为真。

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

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

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;
}