2015-04-22 41 views
0

匹配的項目返回一個列表,我很新的序言和我有這樣的:從兩個列表中的Prolog

compare_list(Hours1, Hours2, Matching) 

我想名單小時1和小時2之間的匹配小時返回到列表中匹配

我可以得到比賽,但不能構建比賽列表。

小時1可以是這樣的:[1,2,3], 小時2可以是這樣的:[2,3], 所以從這個: 匹配時間應該是:[2,3]

幫助將不勝感激。

我已經實現了Vennik建議的內容,它非常接近我想要的。 結果從小時1:[2,3,5],小時2:[2,5] 提供以下內容:

Matching = [2, 5] ; 
Matching = [2] ; 
Matching = [5] ; 
Matching = [] 

是否有可能只擁有第一套而不產生其他三個結果?

+1

你能告訴你的企圖迄今? –

+1

因此,一個小時的列表只是一個有序的整數列表?正如C.B.提到的,請說明您嘗試了什麼以及您卡在哪裏。 – lurker

回答

0

試試這個:

compare_list([], _, []). 
compare_list([Hour | Hours1], Hours2, [Hour | Matching]) :- 
    member(Hour, Hours2), 
    compare_list(Hours1, Hours2, Matching). 
compare_list([_ | Hours1], Hours2, Matching) :- 
    compare_list(Hours1, Hours2, Matching). 

調用compare_list([1,2,3], [1,2], X), !.將導致X = [1,2]

+0

近乎完美。已編輯原始文件以顯示結果,如果可能,我想要什麼。 – gipo

+0

它適用於我的新代碼嗎? – Vennik

+0

這是完美的,我需要什麼,謝謝 – gipo

1

您可能需要考慮相關問題intersection and union of 2 lists

尤其是我logically pure answer上述問題可能是用好你的,因爲它提供了多重優勢在發表@vennik上面的代碼:

  1. 謂詞的行爲方式關係應。 「多方位」。
  2. 它們是單調的,並且在任意泛化/專業化時保持健全。
  3. 他們旨在完整的利益關係,在需要時創建選擇點。
  4. 它們高效,避免創建無用的選擇點。
0

我知道這是不是 ...(或不蒙託內,如果你喜歡)......但是,如果你不是一個純粹,SWI-Prolog的給你謂詞

intersection/3 

,你可以以這種方式使用

intersection(Hours1, Hours2, Matching). 
+0

@repeat:這是一個很大的真實! – Ludwig