我无法理解如何撤销和附加到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]。我如何在思想和代码中表达这一点?现在我只想回到结果,这是一个反向附加列表。
答案 0 :(得分:1)
看起来你正在犯一个经典的错误,许多命令式程序员在尝试逻辑编程时会犯这样的错误。您将对谓词的调用嵌套,就好像它们返回值一样。他们没有回报价值。
所有谓词都会评估为true
或false
。如果true
然后计算继续,或者如果false
,那么计算会回溯以寻找另一个解决方案。
这里你要写的是:
palindrome(Base,Result) :- reverse(Base,Reverse,[]), append(Base,Reverse,Result).
因此,只有在reverse
为真后才能调用append
,并且reverse
完成后Reverse
统一,然后Result
就可以计算出来。< / p>