Prolog中的变量相等应用于列表

时间:2014-04-01 10:38:45

标签: prolog

假设您有一个这样的列表:

[
  [[X],[X]],             %1
  [[Y],[Y]],             %2
  [[X],[Y]],             %3
  [[X,Y],[X,Y]],         %4
  [[X,Z],[X,Z]],         %5
  [[X,Y],[Y,X]],         %6
  [[X,Y],[X,Y],[X,Y],    %7
  [[X,Z],[X,Z],[X,Z],    %8
  [[X,Y],[X,Z],[Z,Y],    %9
]

我想定义一个等于运算符,以便:

  • 元素1和2被认为是相等的,即[[X],[X]] == [[Y],[Y]]为真
  • 元素4和5被认为是相等的,即[[X,Y],[X,Y]] == [[X,Z],[X,Z]]为真
  • 元素7和8被认为是相等的,即[[X,Y],[X,Y],[X,Y]] == [[X,Z],[X,Z],[X,Z] ]是真的

等式是根据变量的位置来定义的,而不是变量本身。

所以[[X],[X]]和[[Y],[Y]]是相等的,因为它们的变量的位置是相同的。

我想使用此等于运算符将列表转换为集合。但是,我不确定如何定义这种平等。

我正在考虑用索引号替换每个变量,如下所示:

[[X],[X]] = [[1],[1]]
[[Y],[Y]] = [[1],[1]]
[[X],[Y]] = [[1],[2]]
[[X,Y],[X,Y]] = [[1,2],[1,2]]
[[X,Z],[X,Z]] = [[1,2],[1,2]]
[[X,Y],[Y,Z]] = [[1,2],[2,1]],
[[X,Y],[X,Y],[X,Y] = [[1,2],[1,2],[1,2]]
[[X,Z],[X,Z],[X,Z] = [[1,2],[1,2],[1,2]]
[[X,Y],[X,Z],[Z,Y] = [[1,2],[1,3],[3,2]]

但这似乎有点'hacky'

有人可以帮忙吗?

P.S。

这个问题可能需要一个更好的标题,我不确定要放什么。

2 个答案:

答案 0 :(得分:2)

我相信您正在寻找 variant 的概念,即与变量重命名相等的术语。有几个Prolog有一个名为variant/2的内置函数(例如SWIECLiPSe)。 ISO Prolog的最新版本有subsumes_term / 2,可用于定义

variant(X,Y) :- subsumes_term(X,Y), subsumes_term(Y,X).

答案 1 :(得分:0)

不确定这将有多大用处,它只是一个尝试对每对进行专门比较(eequ / 2)的例子......

t(Fe,Se) :- L = [
  [[P,X,Y],[Q,X,Y]],
  [[P,X,Z],[Q,X,Z]],
  [[P,X,Y],[Q,Y,X]]
],
    select(Fe, L, R),
    member(Se, R),
    eequ(Fe,Se).

eequ([F|L1],[F|L2]) :- maplist(==,L1,L2).

如果当然,它会复制匹配的行......

?- t(A,B).
A = B, B = [[_G2289, _G2292, _G2295], [_G2301, _G2292, _G2295]] ;
A = B, B = [[_G2289, _G2292, _G2295], [_G2301, _G2292, _G2295]] ;
false.