2011-06-22 84 views
7
  1. 我能有兩個參數的遞歸Prolog的謂詞,稱爲反向,它返回一個列表的倒數:遞歸Prolog的謂詞反向/迴文

    樣品的查詢和預期的結果:

     
    ?- reverse([a,b,c], L). 
    L = [c,b,a]. 
    
  2. 兩個參數的遞歸Prolog謂詞,稱爲palindrome,如果給定列表是迴文,則返回true。

    樣品查詢與預期的結果:

     
    ?- palindrome([a,b,c]). 
    false. 
    
    ?- palindrome([b,a,c,a,b]). 
    true. 
    

回答

6

廣告1:這是不可能的定義reverse/2爲(直接編輯THX到@Repeat:尾)遞歸謂詞 - 除非你允許的輔助謂詞。

廣告2:

palindrome(X) :- reverse(X,X). 

但是最簡單的方法是與DCG中定義這樣的謂詞:

iseq([]) --> []. 
iseq([E|Es]) --> iseq(Es), [E]. 

reverse(Xs, Ys) :- 
    phrase(iseq(Xs), Ys). 

palindrome(Xs) :- 
    phrase(palindrome, Xs). 

palindrome --> []. 
palindrome --> [E]. 
palindrome --> [E], palindrome, [E]. 
+4

採用DCG中這裏是一個很好的解決方案。 – sharky

5

沒有定義reverse/2與單個遞歸定義,而無需使用一種有效的方式一些輔助謂詞。但是,如果這仍然是允許的,不依賴於任何內置插件一樣append/3(也應該適用於大多數的Prolog實現)一個簡單的解決辦法是使用蓄能器列表,如下:

rev([],[]). 
rev([X|Xs], R) :- 
    rev_acc(Xs, [X], R). 

rev_acc([], R, R). 
rev_acc([X|Xs], Acc, R) :- 
    rev_acc(Xs, [X|Acc], R). 

rev/2是反轉謂詞,它簡單地「委託」到(或包裝)名爲rev-acc/2的基於累加器的版本,該版本以相反的順序將輸入列表的元素遞歸添加到累加器中。

運行此:

?- rev([1,3,2,x,4],L). 
L = [4, x, 2, 3, 1]. 

而且確如@false已經指出的(+1),

palindrome(X) :- rev(X,X). 
2

只是出於好奇在這裏不用遞歸執行反向/ 2不使用輔助謂詞並仍然反轉列表。你可能會認爲它是作弊的,因爲它使用反向/ 2使用列表和結構 -/2作爲參數。

reverse([], []):-!. 
reverse([], R-R). 
reverse(R-[], R):-!. 
reverse(R-NR, R-NR). 
reverse([Head|Tail], Reversed):- 
    reverse(Tail, R-[Head|NR]), 
    reverse(R-NR, Reversed). 
+0

不錯,但不正確。無論如何,我給了你+1。 'reverse(1- [],Ys).'應該失敗,但它會以'Ys = 1'成功。然後,'reverse(Xs,Ys),Xs = [1] .'應該成功,但失敗。所以你不是在作弊,而是簡單地實施另一個程序。我們同意不把這稱爲謂詞 - 我認爲。 – false

+1

@false。你是對的!。這隻適用於正確的輸入列表。 – gusbro

+0

'reverse(Xs,[1])。'這不是一個合適的輸入列表嗎?它成功用'Xs = [1] - []。' – false

0
conca([],L,L). 
conca([X|L1],L2,[X|L3]):- conca(L1,L2,L3). 
rev([],[]). 
rev([X|Y],N):- rev(Y,N1),conca(N1,[X],N). 
palindrome([X|Y]):- rev([X|Y],N),equal([X|Y],N). 
equal([X],[X]). 
equal([X|Y],[X|Z]):- equal(Y,Z). 
+0

-1。你的命名不清的謂詞'conca/3'之間沒有界限,只是'append/3'的一個拷貝,它是ISO,'palindrome/1'會破壞列表而無法獲得任何收益(除了防止空列表成爲否定記號理由),'equal/2'在'=/2'上沒有改進,只是它不必要的更多限制。 「新的東西不好,好的東西不是新的。」 –