2010-09-09 74 views
1

我試圖編寫一個謂詞將元素數組轉換爲一組元素。爲了做到這一點,我已經創造了SWI-序言以下斷言:序言問題 - 將元素數組轉換爲元素集

sterge(_, [], []). 

sterge(A, [A|L], New):- 
    sterge(A, L, New). 

sterge(A, [B|L], [B|New]):- 
A \= B, 
sterge(A, L, New). 

multime(A, New):- 
mult(A, [], New). 

mult([], A, A). 

mult([A|L], [A|T], New):- 
sterge(A, L, L1), 
mult(L1, T, New). 

正如你所看到的,sterge謂語,接受3個參數。其主要目的是將A元素的所有外觀刪除到L列表中,從而生成New列表,其中不包含任何A元素。

在這個謂詞的幫助下,我試圖從列表中逐個消除所有元素,包括它們的所有外觀,並將它們添加到包含給定數組元素的單個副本的新列表中這需要轉化爲一組元素。

mult謂詞需要3個參數。

第一個參數是給定的數組,它必須被轉換成一個集合。

第二個參數是一個緩衝區列表,用於在謂詞執行過程中逐個包含數組的唯一元素。

第三個參數用於返回完整的參數集。

實際上,我希望第三個參數與第二個參數的值統一,當給定數組(第一個參數)爲空([])時。

最後,具有兩個參數(給定數組和所需組)的謂詞multimemult謂詞啓動一個調用,併爲其參數使用以下值。對於第一個參數,它使用給定數組,第二個參數爲空列表([]),對於第三個參數,需要獲取所需的一組元素。

但是,當我爲multime謂詞發起呼叫時,我總是收到false結果。你能告訴我我哪裏錯了嗎?

+0

請提供'sterge','mult'和'multime'的一些調用以及實際和預期的結果。 – lesmana 2010-09-09 08:36:58

+0

我測試過'sterge'謂詞,它工作得很好。例如,對於元素「1」和列表「[1,2,1,2,3,4]」,預期的結果應該是「[2,2,3,4]」。如果您啓動呼叫'sterge(1,[1,2,1,2,3,4],[2,2,3,4])',您應該收到'true'值。另一方面,'multime'和'mult'不能正常工作。我的意思是,對於我介紹的每個價值觀,我都會收到「虛假」價值。預期的結果應該是: – Simon 2010-09-09 09:17:17

+0

'multime([1,2,2,3,3,4,4],[1,2,3,4])。' – Simon 2010-09-09 09:31:10

回答

2

你的mult的身體壞了。

mult([A|L], [A|T], New):- 
sterge(A, L, L1), 
mult(L1, T, New). 

您正在拆分第一個參數的列表和第二個參數的列表。從multime調用mult,並將空列表作爲第二個參數。空列表不能被分割,所以謂詞不能匹配。這就是爲什麼你會得到一個false

這裏是固定的代碼

mult([A|L], T, New):- 
    sterge(A, L, L1), 
    mult(L1, [A|T], New). 

列表串接在遞歸調用做mult。當L1是一個空列表時,遞歸將結束,連接列表將通過New變量返回。注意:新列表將按相反順序排列。