Prolog 反转并追加到列表

Prolog 反转并追加到列表,prolog,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) :- a

我很难理解如何在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]。我如何在思想和代码中表达这一点?现在,我只是想得到一个反向追加列表的结果。

看来,您犯了一个经典错误,这是许多命令式程序员在尝试逻辑编程时犯的错误。您正在嵌套对谓词的调用,就好像它们返回值一样。它们不返回值

谓词所做的只是计算为
true
false
。如果
true
则继续计算,或者如果
false
则计算返回到寻找另一个解决方案

以下是您需要填写的内容:

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

因此,只有在
reverse
为true之后才能调用
append
,一旦
reverse
完成,那么
reverse
是统一的,然后才能计算
Result

您应该引入临时变量:
回文(Base,Result):-reverse(Base,R,[]),append(Base,R,Result)。
。o规则应该是
palindrome(Base,Result):-reverse(Base,Result)。
Prolog中的谓词不是具有返回值的函数,因此
append(Base,reverse(Base,Result,[]),Result)
没有意义。