Prolog 反转并追加到列表
我很难理解如何在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
/*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)
没有意义。