我是新來的Prolog,我有一個練習,要求做一個迴文謂詞返回一個布爾值? 如果列表迴文否則返回false使用序言的迴文謂詞
palindrom([X|Xs],bool) .
我應該怎麼辦呢?這布爾是真的嗎?
我是新來的Prolog,我有一個練習,要求做一個迴文謂詞返回一個布爾值? 如果列表迴文否則返回false使用序言的迴文謂詞
palindrom([X|Xs],bool) .
我應該怎麼辦呢?這布爾是真的嗎?
首先,它不是函數,它是一個謂詞,所以 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").
來看看它是如何的內部
使用第二種解決方案,複製這個': - use_module(library(lists))。'來導出'reverse/2'' –
'trace'for what! – hulk
@hulk使用'trace',你可以看到謂詞如何在它內部遞歸地調用它自己或其他謂詞 –
工作,你可以使用「聲明的方式」如
空列表是迴文。
palindrome([]).
只有一個元素的列表是迴文
palindrome([_]).
現在,我們可以說,如果一個列表是一個迴文,若能去除第一,這個列表中,我們必須在最後一個元素找到另一個迴文,所以
palindrome(L) :-
append([X|T], [X], L),
palindrome(T).
寫代碼將是一個好的開始。我們不是在這裏爲你做你的功課....顯示你所嘗試的(而不僅僅是一個函數調用示例),我們將(可能)嘗試幫助解決這個問題。 –