Prolog中变量相等应用于列表

Prolog中变量相等应用于列表,prolog,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,

假设您有这样一个列表:

[
  [[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]]
但这似乎有点“骇客”

有人能帮忙吗

p、 美国


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

不确定这会有多有用,这只是一个尝试对每一对应用专门比较(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.

我相信您正在寻找变量的概念,即等于变量重命名的术语。一些序言中有一个名为
variant/2
(例如)的内置项。ISO序言的最新版本包含了可用于定义变量的\u term/2

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

你对最高级别列表中的两个元素相等的定义是什么?三个元素中的前两个是否在对应的三元组对中匹配?你能给出一些其他列表中元素相等与元素不相等的例子吗?你的问题只是想知道如何测试e form
[[A,B,C],[D,e,F]
表示相等?变量列表的列表代表什么?滥用列表是Prolog编程中众所周知的代码气味。因此,如果两个元素(1)具有所有相同的子元素和(2)则两个元素相等子元素的顺序是相同的,不管它们是如何分解成子列表的?@mbratch我更新了问题,试图让它更清楚。如果两个元素的相对位置相同,则两个元素是相等的。@PauloMoura它们表示高阶元规则。因此列表[P,X,Y]表示P(X,Y).我试图生成这些元规则,但我有重复项,即P(X,Y)和P(X,Z),它们是相同的。