Dns 合金中关系运算的域与值域
是否有任何操作返回Alloy中关系的范围和域 假设我在Alloy中定义了一个sig,如下所示: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下找到二进制关
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变成一个univ(univ是一元集合常数,它包括模型中的所有元素),a1.univ包括参与关系a1的a元素(即a1的域)。原因是中间元素(即univ中与a1范围匹配的元素)请注意,在a1.univ中,所有a1范围都是匹配和删除的,因为univ包含模型中的所有元素,包括a1范围
希望这能有所帮助。我想补充一些关于点运算符th的评论