2013-07-19 34 views
3

使用prolog,我必須創建一個規則,當給定一個列表時,確定列表的第一個元素是否等於最後一個元素列表中的元素。以下是我的想法。使用Prolog:給出一個列表檢查列表的第一個元素是否等於最後一個元素

The Base Cases: 
1) If The Parameter Is Not A List: Return False 
2) If The Parameter Is A List But Empty: Return False 
3) If The Parameter Is A List But Has One Element: Return False 

The Recursive Step: 
Recursively Going Through The List Getting The 
First Element And TheLast Element Then Compare 

fela() :- false.        <-- Base Case One 
fela([]):-false.        <-- Base Case Two 
fela([H]):-false.       <-- Base Case Three 
fela([H|T]):- H1 is H, H1 == T, fela(T,H1). <-- Recursive Step 

貝婁是功能爲先,最後,會員

first(F, [F|_]). 
last(L, [H|T]) :- last(L, T). 

member(X, [X|_]). 
member(X, [_|T]) :- member(X, T). 

我有我的遞歸步驟的麻煩,我不確定如何存儲的第一要素,並遍歷列表,並獲得最後一個元素,然後比較真/假答案的結果。可能有人幫助我

感謝,

埃裏克:)

+1

因此,您應該接受其中一個答案,這對您最有幫助。 :) –

回答

5

下面是一個簡單的一個:

fela(L) :- first(E, L), last(E, L). 

盯着那個一分鐘,讓它真正沉下

事實上,這是對的,但你的last/2不是,只是遍歷列表中沒有任何基本情況下將會成功。正確的last/2應該是這樣的:

last(L, [L]). 
last(E, [_|L]) :- last(E, L). 

我看到很多模糊認識你的情況分析。一方面,在Prolog中,你不明確地返回true和false。你只是匹配你所匹配的,其餘的都是失敗的。在處理列表時,您會自動繼承空列表的基本情況以及元素的歸納情況和列表的其餘部分。這不足以從頭開始實施fela/1,因爲您無法記住您的第一個元素是什麼。所以如果你想從頭開始構建它,你需要一個輔助謂詞,這樣你可以繼續傳遞第一個元素。它看起來是這樣的:

fela([H|T]) :- fela(H, T). 

fela(First, [First]). 
fela(First, [_|Xs]) :- fela(First, Xs). 

請注意,我們保留了一個基本情況的分析,一個處理列表的歸納情況。這是處理遞歸數據結構時的常見情況。 first/2是您不遵守規則的一個很好的例子,因爲您對其中一個案例不感興趣。用first/2last/2建立謂詞可以讓你徹底擺脫案例分析問題,而且(在我看來)更多的時候是在實踐中發生的。

現在,我想單獨列出您的一些想法,以供進一步評論。首先,H1 is H絕對不是你想要的。 is/2專門用於減少算術表達式。您將始終在左側有一個變量,在右側有一個表達式,或者它沒有意義。你試圖在這裏做一些類似的任務,但即使H1 = H在這裏沒有幫助,因爲雖然Prolog有變量,it does not have assignables

H1 is H, H1 == T難以置信地說,H既是名單的頭部,又相當於尾巴。這是不可能的,因爲尾部是一個列表,頭部是一個元素。即使你可以制定一個這樣的情況,這個謂詞絕對不會有意思。你在這裏的遞歸步驟真的很奇怪。

您的案例分析的另一個問題,案例#3應該是真實的。由於[X],X既是列表的第一個也是最後一個元素,所以fela/1對於所有單元素列表都應該是平凡的。

我會主張進一步研究。我認爲你有一些奇怪的觀點,即多一點閱讀可能會改正。

+1

非常感謝您的幫助,我對prolog有點不安,這是我第一次使用該語言。你爲我清楚了很多事情。再次感謝您的幫助。 –

+1

@ErikSmiley我的榮幸。給予好評/接受? :)我認爲你會好起來的,只是堅持下去。 –

+0

這個OP不能讓你高興,Daniel。 :)(他們需要15個代表)。讚美羅伯特哈珀的博客鏈接。 –

相關問題