反转并附加到列表

时间:2014-11-10 04:05:19

标签: prolog

我无法理解如何撤销和附加到prolog中的列表。

/*reverse list code - CALL=reverse([a,b,c],X,[]).*/
reverse([],Z,Z).
reverse([H|T],Z,Acc) :- reverse(T,Z,[H|Acc]).

/*append code*/
append([],L,L).
append([H|T], L, [H|NewT]) :- append(T,L,NewT).

palindrome(Base,Result) :- append(Base,reverse(Base,Result,[]),Result).

我是逻辑编程的新手,所以我试图获得像[a,b,c]这样的基础并反转然后附加它,结果将是[a,b,c,c, b,A]。我如何在思想和代码中表达这一点?现在我只想回到结果,这是一个反向附加列表。

1 个答案:

答案 0 :(得分:1)

看起来你正在犯一个经典的错误,许多命令式程序员在尝试逻辑编程时会犯这样的错误。您将对谓词的调用嵌套,就好像它们返回值一样。他们没有回报价值。

所有谓词都会评估为truefalse。如果true然后计算继续,或者如果false,那么计算会回溯以寻找另一个解决方案。

这里你要写的是:

palindrome(Base,Result) :- reverse(Base,Reverse,[]), append(Base,Reverse,Result).

因此,只有在reverse为真后才能调用append,并且reverse完成后Reverse统一,然后Result就可以计算出来。< / p>