I'm writing some specifications of a system in B-method. I have the following variables which are subsets of a general set:
I want to state a rule that whenever something exists in set "b", it also exists in set "a" which helps writing the above specifications as the following:
Explanation of second notation: I want the machine to infer that a :={x,y,z,v} from a :={v}, b :={x,y,z}, and the rule.
How can I express the rule so I avoid the first notation and instead write the second notation?
I tried the following but it didn't work
INITIALISATION
a :={v} &
b :={x,y,z}
ASSERTIONS
!x.(x:b => x:a)
答案 0 :(得分:0)
首先,谓词!x.(x:b => x:a)
可以更容易地由b<:a
表达。
我不清楚你想要表达的是什么:b
是{@ 1}}的一部分还是仅仅是初始化?
如果始终如此,a
将是正确的位置。 INVARIANT
类似,但应该是其他不变量的含义。
但是,你必须在初始化时明确确保。
我不清楚的另一点是“推断”是什么意思。你不想指定细节吗?
使用超过ASSERTIONS
的一个元素分配a
集的初始化可能如下所示(假设b
和a
包含b
的元素):
S
(免责声明:我实际上没有测试过它。)
如果INITIALISATION
ANY v,s
WHERE
v:S
& s<:S
THEN
a := s\/{v}
|| b := s
END
应始终大于a
,则可以添加b
之类的内容。
您的描述并不清楚您想要实现的目标。
另一种方法是使用“变成这样的替代”(但在我看来它不太可读):
v/:s
答案 1 :(得分:0)
首先,最重要的是,B机器本身并不推断任何东西。它提供了一种语言,用户可以表达属性和生成证明义务的机制,证明者必须成功处理(自动或人工协助),以保证财产保持不变。
在您的示例中,如果您想表示集合bb
的每个元素始终是集合aa
的元素,那么就像danielp所观察到的那样,只需写一下
bb <: aa
接下来,如果你想写aa
使用一个不在bb
中的元素,那么你可以把它表示为
aa /= bb & not(aa = {})
或
#(elem).(elem : S & elem : bb & not(elem : aa))
如果您想表达特定值vv
在aa
但不在bb
中,则以下情况适用
vv : bb & not(vv : aa)
这些表达式可以在B机器的多个位置使用,具体取决于您是否要声明参数,常量或变量的属性。
例如,假设您有一台具有两个变量va
和vb
的计算机,其中两个变量都是给定集合s1
的元素集,并且您希望它们在这样一种方式,vb
的每个元素也是va
的元素,并且存在va
的元素不在vb
中。首先请注意,这意味着vb
是va
的严格子集。
INITIALISATION
ANY inia, inib WHERE
inia <: s1 & inib <: s2 & inib <<: inia
THEN
va := inia || vb := inib
END