【发布时间】:2015-01-04 01:40:29
【问题描述】:
如何在 ISO Prolog 中为在 linear 时间内运行的两个变量列表的交集定义一个(元逻辑)谓词?变量可以以任何确定的顺序出现。没有像变量“年龄”这样的实现相关属性必须影响结果。
类似于library(ordsets),我们称关系为varset_intersection(As, Bs, As_cap_Bs).
?- varset_intersection([A,B], [C,D], []).
true.
?-varset_intersection([A,B], [B,A], []).
false.
?- varset_intersection([A,B,C], [C,A,D], Inter).
Inter = [A,C].
or
Inter = [C,A].
?- varset_intersection([A,B],[A,B],[A,C]).
B = C
or
A = B, A = C
?- varset_intersection([A,B,C],[A,B],[A,C]).
idem
也就是说,第三个参数是一个输出参数,它与前两个参数的交集统一。
参见当前 ISO 标准中的 list of the built-ins(ISO/IEC 13211-1:1995 包括 Cor.2)。
(请注意,我确实在几年前的另一个问题中回答了这个问题。但是,它对 Google 来说仍然是隐藏和不可见的。)
【问题讨论】:
-
第一个查询(
varset_intersection([A,B], [B,A], []).)的答案是假的,对吧? -
以下查询的结果应该是什么:
varset_intersection([A,B],[A,B],[A,C]).和varset_intersection([A,B,C],[A,B],[A,C]).是否应该通过将 real 交集与第三个参数统一来满足这些目标? -
现在应该清楚了。
-
我需要进一步理解的一件事:将 或 放在不同的结果之间意味着目标应该只满足这两个结果中的任何一个吗?
-
我放弃了... O(|L1|+|L2|) 怎么办?等待一些聪明的“把戏”......
标签: prolog iso-prolog