2015-04-22 67 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