Alloy是否有可能按照优先顺序预测行动顺序?

时间:2014-03-17 12:24:33

标签: alloy

我有一个描述升降机的合金模型 - 有许多建筑 B ,它有几个升降机。考虑破损电梯的情况。假设同时打破不同家庭中的几部电梯,并且有一些损坏的报告。主要问题是升降机应该先行?

我描述了这个模型并尝试优先检查断言,以便首先应该在哪里进行升降机:

sig Boolean {}
one sig True, False extends Boolean {}

sig Lift {broken:Boolean}

sig House {
  lift: set Lift,
  hospital:Boolean,
  alert:Boolean,
  people_hurt: Boolean
}

sig B1 extends House{}
fact {all b:B1|b.lift!=none}

sig P extends B1{}
fact {all b:P|b.people_hurt = True}

sig B2 extends P {}
fact {all b:B2| b.alert = True}

sig L extends House{}
fact {all b:L|b.alert = True}

sig B3 extends B1{}
fact{all b:B3|b.alert = True}

assert Priority1 {B3 = none}
assert Priority2 {B2 = none}

check Priority1 for 10 House, 10 Lift, 2 Boolean
check Priority2 for 10 House, 10 Lift, 2 Boolean

我使用了合金分析仪,但没有理解它给我看的东西。主要问题是 - 是否有可能使用这种模型来提升升降机预测人员疏散的正确顺序?

1 个答案:

答案 0 :(得分:2)

让我们在这里区分两个问题。

首先,分析师告诉你什么?

这里最简单的事情可能就是与分析师进行简短的会谈。

当我加载模型并要求分析器检查第一个断言时,它会找到一个反例。由于实例有九个房子和八个电梯,我很难确切地看到发生了什么,所以我做的第一件事就是添加一个新命令check Priority1 for 3,给我一些更小,更快理解的实例。

该请求的第一个反例有三个房子,一个是签名B1,P和B3,另一个是破坏的。所有三个房子共用同一个电梯。为了更容易看到房屋的不同,我在实例的显示中定制了主题,使所有关系都显示为属性(以及弧形)。因此,很容易看出分析仪找到了断言的反例,

  • 名为B1的房子,警报= False,people_hurt = True。
  • 一个名为B3的房子,警报= True,people_hurt = False。
  • 一个名为P的房子,警报= False,people_hurt = True。

正在检查的断言,Priority1,表示该模型的任何实例都不会有任何签名B3的房屋(这些房屋都将至少有一个Lift,并且都将警报设置为True)。

由于似乎没有任何限制会妨碍签名B3的存在,因此分析仪找到反例的事实似乎并不令人惊讶。

我理解的模型内容大致如下:

  • 有升降机。
    (我并不完全确定你的意思是什么?在这里;在英国英语中,“升降机”这个词用于美国英语总是称之为“电梯和电梯” #39 ;;根据你的说明的措辞,我认为你将它们视为两种不同的东西。所以我想象一个Lift作为某种应急设备。[否则,我不知道有多么不同房屋可以分享电梯。]从正式的角度来看,当然,这并不重要;从实际的角度来看,这意味着我不能很好地理解你所尝试的东西。说,只能按你所说的去做。)

  • 有房子 每个房子都与一些升降机相关联,可能有一个 警惕,可能会让人受伤。

  • L是房屋的子类。 此子类中的所有房屋都有警报。 (我并不完全确定警报= True意图在域中意味着什么,因此"有警报"可能不是描述此属性的最佳方式;抱歉。)

  • B1是房屋的子类(与L不相交)。 该子类中的所有房屋都与非空的升降机相关联。

  • B3是B1的子类 这个子类中的所有房屋都有一组非空的升降机并有警报。

  • P是B1的另一个子类(与B3不相交)。 这个子类中的所有房屋都有一组非空的升降机,让人受伤。

  • B2是P.的子类 这个子类中的所有房屋都有一组非空的升降机,让人受伤,并有警报。

(从长远来看,重组签名层次结构可能更方便,但让我们推迟到第二个问题。)

该模型还包含两个断言,两个断言都很容易证伪:

  • 不会有签名B3的实例。
  • 不会有签名B2的实例。

其次,您如何使用Alloy来模拟优化应急响应的问题?

我没有尝试完全回答这个问题;一方面,我没有时间,而另一方面,我并不完全确定我理解这些要求。因此,我将自己局限于一些一般性建议。

如果你想对一系列房屋进行建模,其中一些房屋有警报,有些房间没有警报,有些房屋有人受伤,有些房屋没有,有些可能更方便定义像

这样的签名
sig People_Hurt in House {}
sig Alert_Yes in House {}

然后,您的约束可以简单地通过引用People_Hurt而不是通过间接检查将House映射到布尔值的people_hurt关系的值来引用受伤人员的房屋集合。 (你的布尔类型也不错,只是不必要。如果你想保留它,做布尔符号摘要,那么你不需要在你的范围内挑出" 2布尔")那里& #39;这是我在杰克逊书中所说的一个例子 - 寻找红绿灯的模型。

如果您只是想说,给定一组特定的房屋,不同程度的损坏和伤害,哪些房屋应该是第一响应者的首要任务,您可以尝试定义一个标识给定模型实例的最高优先级房屋。

如果你想对一系列响应进行建模:首先是这个房子,然后是这个,然后你有一个更复杂的任务,因为你需要建模状态的变化。这是值得做的,但我最重要的建议是:从小做起,只是努力使情况的描述正确:编写房屋,损坏和伤害的规则,并继续生成实例,直到你得到你需要的各种实例。 然后开始担心确定最优先的房屋。然后才开始考虑事件序列。 (当然,只是我的建议;你的里程可能会有所不同。)