使用序言的回文谓词

Palindrome predicate using prolog

我是 Prolog 的新手,我有一个练习要求制作一个 returns 布尔值的回文谓词? 如果列表是回文,则此布尔值为 true,否则 returns false

palindrom([X|Xs],bool) .

我应该怎么做?

首先,它不是函数,它是一个谓词,所以 palindrom 就像将列表与它的反转进行比较,如 L=[x,y,x], L1=[x,y,x] 那么你应该在 ,

之前反转列表

代码

palindrom(Xs):-palindrom(Xs,Xs,[]). % the second Xs is copy of Xs in input and [] is the auxliare
palindrom([],Xs,Xs).
palindrom([Y|Ys],Xs,Zs):- palindrom(Ys,Xs,[Y|Zs]).

版本 2

 palindrom(Xs) :- reverse(Xs,Xs).

注意:reverse/2 反转列表,但在此谓词中 return 布尔值,因为第二个是反转列表的输入

结果

| ?- palindrom([a,b,c]).
no

| ?- palindrom([a,b,a]).
yes

有关详细信息,请使用 ?-trace,palindrom("radar"). 查看其内部工作原理

您可以使用 "declarative way" 例如

空表是回文

palindrome([]).

只有一个元素的列表是回文

palindrome([_]).

现在,可以说如果一个列表是回文,如果我们删除这个列表的第一个和最后一个元素,我们必须找到另一个回文,所以

palindrome(L) :-
    append([X|T], [X], L),
    palindrome(T).