Prolog 序言:回文谓词永远不会成功

Prolog 序言:回文谓词永远不会成功,prolog,palindrome,Prolog,Palindrome,我开发了一个回文检查算法,可以简单地反转给定的元素列表;使用天真的反转。然后程序检查是否生成相同的列表。但我似乎有一个我无法解决的问题。程序总是返回false。这是我到目前为止开发的程序 reverseCurrentList([H|T],ReversedList):- reverseCurrentList(T,RevT), append(RevT,[H],ReversedList). isPalindrome(GivenList):- reverseCurrentLi

我开发了一个回文检查算法,可以简单地反转给定的元素列表;使用天真的反转。然后程序检查是否生成相同的列表。但我似乎有一个我无法解决的问题。程序总是返回false。这是我到目前为止开发的程序

reverseCurrentList([H|T],ReversedList):-
    reverseCurrentList(T,RevT),
    append(RevT,[H],ReversedList).

isPalindrome(GivenList):- 
    reverseCurrentList(GivenList,ReversedList),
    GivenList=@=ReversedList.

编辑:最终版本 最后,我用以下代码解决了问题:

% A palindrome can be read forward or backward; e.g. [x,a,m,a,x]

% is_palindrome(L) :- L is a palindrome list

is_palindrome(L) :-
   reverse(L,L).

您的
reverseCurrentList
规则缺少一个base子句,因此它永远不会成功。递归调用继续从列表中提取项目,直到列表为空,此时
[H | T]
不再统一,因此规则失败

将第二个子句添加到程序中:

reverseCurrentList([], []).

非常感谢,先生,现在可以用了。但我能问一下这个基本条款是什么意思吗?这是否意味着当两个列表为空时,反转停止?如果是这样,那么程序为什么会在@user3490561之后检查这两个列表是否相等?@user3490561您编写的递归子句通过将头附加到反转尾部的结果来反转列表,也就是说,通过反转短一项的列表来反转列表。在某些情况下,尾部没有项目。这就是base子句起作用的时候:它告诉您的程序如何解决“退化情况”,即如何反转空列表。一旦达到这一目标,您的程序将停止反转,并开始将列表头添加到递归构造的反转列表中。非常感谢先生提供了准确且信息丰富的答案。请注意,
isPalindrome([A,B])
失败,但应该成功地将
A
B
统一起来。我不确定是否理解这个问题。最初,您有一个回文的自定义谓词,它不起作用,因为它缺少@dasblinkenlight在其答案中指出的基本情况,您接受了答案。然后你用另一个实现编辑了你的问题,使用了
反向
,效果很好。@lower我搞错了,先生,对不起。现在它被更正了。@重复一遍,我认为它应该被还原为有用的。就目前而言,这真的没有意义。把两个版本都放进去