Dns 合金中关系运算的域与值域

Dns 合金中关系运算的域与值域,dns,range,relation,alloy,model-checking,Dns,Range,Relation,Alloy,Model Checking,是否有任何操作返回Alloy中关系的范围和域 假设我在Alloy中定义了一个sig,如下所示: sig A {r : B } sig B {} 我正在寻找和操作应用于r,并给我B(可能类似于返回B的r[B]) 上面的情况可能看起来很愚蠢,因为r[B]会返回B,所以为什么我不首先使用B呢!实际上,我发现范围和域操作(如果它们曾经存在)在编写事实(约束)时非常有用。e、 g: 有什么想法吗?:) 您将在library module relation.als中分别在名称ran和dom下找到二进制关

是否有任何操作返回Alloy中关系的范围和域

假设我在Alloy中定义了一个sig,如下所示:

sig A {r : B }

sig B {}
我正在寻找和操作应用于r,并给我B(可能类似于返回B的r[B])

上面的情况可能看起来很愚蠢,因为r[B]会返回B,所以为什么我不首先使用B呢!实际上,我发现范围和域操作(如果它们曾经存在)在编写事实(约束)时非常有用。e、 g:


有什么想法吗?:)

您将在library module relation.als中分别在名称
ran
dom
下找到二进制关系的范围函数和域函数。Daniel Jackson关于软件抽象的书的第3.2.5节和第3.4.3.6节中有简短的讨论

另一方面,也可以不使用库函数。对于任何二元关系r,r的域和范围也可以分别表示为r.univ和univ.r。使用方框运算符而不是点,范围也可以表示为r[univ]。(请注意,示例r[B]将不返回任何内容,因为它与B.r等价,并且B中的内容与r中任何一对的第一项都不匹配(因为第一项都在A中,而不是B中,并且在示例A和B中是不相交的)。如果您想要出现在r对中的B的子集,则需要写入A.r,或者等效地写入r[A]在这种情况下,由于r中的第一项始终是A的一个元素,因此A.r相当于univ.r

请注意,单词domain和range有多种用法。术语domain有时用于表示在关系对中作为第一项出现的一组事物(range类似地表示在任何一对中作为第二项出现的一组事物),有时用于表示可能作为第一项出现的一组事物(第二)成对项。库函数和表达式r.univ和univ.r都计算为第一种意义上的域和范围,而不是第二种意义上的域和范围。根据第一个示例,在Alloy中,关系r的域不一定等于集合B;它也可以是B的适当子集


[附录]要检查关系
fid+mid
是内射的,一种简单的方法是编写

fact {
  all o : O | lone x : M + F | x.mid = o or x.fid = o
}
如果您想断言
fid+mid
也超过
M+F
,请使用
one
而不是
lone
;我不理解“内射”会包含这一点

更简洁的表述可能采用更“相关”的风格:

lone (mid + fid).o
用这个成语重铸,你的事实就会读出来

fact mid_fid_injective {
  all o : O | lone mid.o
  all o : O | lone fid.o
  all o : O | lone (mid + fid).o
}
当然,这里的第一句和第二句是由第三句暗示的,所以你可以通过

fact mid_fid_injective {
  all o : O | lone (mid + fid).o
}

在library module relation.als中,您将分别在名称
ran
dom
下找到二进制关系的范围函数和域函数。Daniel Jackson的《软件抽象》一书的第3.2.5节和第3.4.3.6节中有简要讨论

另一方面,您也可以不使用库函数。对于任何二元关系r,r的域和范围也可以很容易地分别表示为r.univ和univ.r。使用box运算符而不是点,范围也可以表示为r[univ]。(请注意,您的示例r[B]将不返回任何内容,因为它等价于B.r,并且B中的任何内容都不匹配r中任何一对的第一项(因为第一项都在A中,而不是B中,并且在示例中A和B是不相交的)。如果您想要出现在r对中的B的子集,则需要写入A.r,或等价地写入r[A]在这种情况下,由于r中的第一项始终是A的一个元素,因此A.r相当于univ.r

请注意,单词domain和range有多种用法。术语domain有时用于表示在关系对中作为第一项出现的一组事物(range类似地表示在任何一对中作为第二项出现的一组事物),有时用于表示可能作为第一项出现的一组事物(第二)成对项。库函数和表达式r.univ和univ.r都计算为第一种意义上的域和范围,而不是第二种意义上的域和范围。根据第一个示例,在Alloy中,关系r的域不一定等于集合B;它也可以是B的适当子集


[附录]要检查关系
fid+mid
是内射的,一种简单的方法是编写

fact {
  all o : O | lone x : M + F | x.mid = o or x.fid = o
}
如果您想断言
fid+mid
也超过
M+F
,请使用
one
而不是
lone
;我不理解“内射”会包含这一点

更简洁的表述可能采用更“相关”的风格:

lone (mid + fid).o
用这个成语重铸,你的事实就会读出来

fact mid_fid_injective {
  all o : O | lone mid.o
  all o : O | lone fid.o
  all o : O | lone (mid + fid).o
}
当然,这里的第一句和第二句是由第三句暗示的,所以你可以通过

fact mid_fid_injective {
  all o : O | lone (mid + fid).o
}

我想添加一些关于点运算符的注释,这将有助于理解为什么r.univ和unive.r分别是关系r的返回域和范围

合金中的点操作类似于成分操作。为了描述它,假设以下设置:

a1 is an arrow /relation from A to B
a2 is and arrow/ relation from B to C
a1.a2是从A到C的箭头/关系。在a1.a2中,属于B且在a1范围内和a2范围内的中间元素被省略

在合金中,点操作也可用于集合。 在上面的示例中,如果a2变成一个univuniv是一元集合常数,它包括模型中的所有元素),a1.univ包括参与关系a1的a元素(即a1的域)。原因是中间元素(即univ中与a1范围匹配的元素)请注意,在a1.univ中,所有a1范围都是匹配和删除的,因为univ包含模型中的所有元素,包括a1范围


希望这能有所帮助。

我想补充一些关于点运算符th的评论