假设您有一个这样的列表:
[
[[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
]
我想定义一个等于运算符,以便:
等式是根据变量的位置来定义的,而不是变量本身。
所以[[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。
这个问题可能需要一个更好的标题,我不确定要放什么。
答案 0 :(得分:2)
我相信您正在寻找 variant 的概念,即与变量重命名相等的术语。有几个Prolog有一个名为variant/2
的内置函数(例如SWI,ECLiPSe)。 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.