从两个列表Prolog中匹配的项目返回一个列表

时间:2015-04-22 16:04:48

标签: list prolog matching

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

compare_list(Hours1, Hours2, Matching) 

我想将列表Hours1和Hours2之间的匹配小时数返回到匹配列表

我可以获得匹配但不构建匹配列表。

  

小时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 = [] 

是否可以只生成第一组而不产生其他三个结果?

3 个答案:

答案 0 :(得分:1)

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

特别是,我的logically pure answer以上问题可能对您有用,因为它提供了多个优势而不是上面的@vennik发布的代码:

  1. 谓词表现出关系的方式。 "多向"
  2. 它们是单调的,并且在任意泛化/专业化时保持健全。
  3. 他们的目标是完整的利益关系,在需要时创造选择点。
  4. 他们很有效率,避免创造无用的选择点。

答案 1 :(得分: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]

答案 2 :(得分:0)

我知道那不是 ...(或者不是 montone ,如果你愿意的话)...但是,如果你不是纯粹主义者,SWI-Prolog为您提供谓词

$bilder = glob( "../showcase/images/*.jpg" );
$seed = floor(time()/20); 
srand($seed); 
$random_image = $bilder[rand(0, count($bilder)-1)];
echo $random_image;

你可以这样使用

intersection/3