【问题标题】:Prolog intersection of list elementsProlog 列表元素的交集
【发布时间】:2020-03-16 16:08:42
【问题描述】:

我有一个包含 8 个元素的列表:

[[a], [a], [a, b], [b, c], [c, d, e], [d, f], [f], [f]]

目标是有一个相邻元素相交的列表:

[[a], [a], [b], [c], [d], [f], [f]]

在 Prolog 中最好的方法是什么?

【问题讨论】:

  • 你尝试了什么,什么不起作用?
  • 我试图用intersection和maplist函数来做,但我失败了。我无法习惯这种编程方式。

标签: list prolog intersection


【解决方案1】:

回想一下,Prolog 允许您在列表上使用模式匹配:[X|XS] 匹配一个非空列表,第一个元素 XXS 是剩余的列表。您可以将其扩展到[X,Y|ZS],它匹配至少有两个元素XY 的列表,而ZS 是剩余的列表。

标准库提供intersection/3 来获取两个列表的交集。

merge_adj([],[]).
merge_adj([_],[]) :- !.
merge_adj([X,Y|ZS], [M|MS]) :- intersection(X,Y,M), merge_adj([Y|ZS], MS).
?- merge_adj([[a], [a], [a, b], [b, c], [c, d, e], [d, f], [f], [f]], Z).
Z = [[a], [a], [b], [c], [d], [f], [f]].

第二条规则中的 ! 并不是严格需要的,但可以防止 Prolog 尝试(并且失败)在第二条规则之后将第三条规则应用于只有一个元素的列表。这样一来,在找到唯一解之后,就不会再寻求进一步的解了。

【讨论】:

    猜你喜欢
    • 2018-04-24
    • 2015-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多