2016-01-26 96 views
-2

我是新來的Prolog,我有一個練習,要求做一個迴文謂詞返回一個布爾值? 如果列表迴文否則返回false使用序言的迴文謂詞

palindrom([X|Xs],bool) . 

我應該怎麼辦呢?這布爾是真的嗎?

+1

寫代碼將是一個好的開始。我們不是在這裏爲你做你的功課....顯示你所嘗試的(而不僅僅是一個函數調用示例),我們將(可能)嘗試幫助解決這個問題。 –

回答

0

首先,它不是函數,它是一個謂詞,所以 palindrom就像比較列表和它的反轉,就像L = [x,y,x],L1 = [x,y,x]那麼你應該反轉列表befor,

代碼

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). 

注意:反向/ 2反轉列表但在這種謂詞返回布爾值,因爲第二個是反轉列表中的intput

結果

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

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

瞭解更多詳情使用?-trace,palindrom("radar").來看看它是如何的內部

+0

使用第二種解決方案,複製這個': - use_module(library(lists))。'來導出'reverse/2'' –

+0

'trace'for what! – hulk

+0

@hulk使用'trace',你可以看到謂詞如何在它內部遞歸地調用它自己或其他謂詞 –

2

工作,你可以使用「聲明的方式」如

空列表是迴文。

palindrome([]). 

只有一個元素的列表是迴文

palindrome([_]). 

現在,我們可以說,如果一個列表是一個迴文,若能去除第一,這個列表中,我們必須在最後一個元素找到另一個迴文,所以

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