Return 来自在两个列表 Prolog 中匹配的项目的列表

Return a list from items matching in two lists Prolog

我是 Prolog 的新手,我有这个:

compare_list(Hours1, Hours2, Matching) 

我想return将列表Hours1和Hours2之间的匹配时间放入列表Matching

我可以获取匹配项但无法构建匹配项列表。

Hours1 may be like: [1,2,3], Hours2 may be like: [2,3], So from this: Matching Hours should be: [2,3]

不胜感激。

我已经实现了 Vennik 的建议,它非常接近我想要的。 Hours1 的结果:[2,3,5],Hours2:[2,5] 给出以下内容:

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

是否可以只有第一个集合而没有产生其他三个结果?

试试这个:

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]

您可能需要考虑相关问题 intersection and union of 2 lists

特别是,我对上述问题的 logically pure answer 可能对您很有用,因为它比上面 @vennik 发布的代码提供 多重优势

  1. 谓词按照关系应有的方式运行。 "Multi-directional."
  2. 它们是单调的,并且在任意泛化/专业化后保持健全。
  3. 他们以利益关系的完整性为目标,在需要时创建选择点。
  4. 它们是高效的,避免创建无用的选择点。

我知道那不是 pure...(或者不是 montone,如果你愿意)...但是,如果你不是 纯粹主义者,SWI-Prolog 给你谓词

intersection/3

你可以这样使用

intersection(Hours1, Hours2, Matching).