如何创建100%声明式模型?

时间:2018-06-22 18:59:14

标签: alloy

我正在创建一个简单的网络模型。网络包含节点。节点发送和接收数据。

这是对网络建模的一种方法:每个节点都有一个“数据”字段,表示该节点在时间t拥有的数据。每个节点还有一个“发送”字段,记录在时间t发送到其他节点的数据。

sig Node {
    data: Data -> Time,                   
    send: Data -> Node -> Time   
}

在100%声明性和100%命令性之间的范围内,我认为该签名不在100%声明性方面。在我的第一段中,我没有提及具有数据存储的节点,也没有提及保留已发送数据的记录。

而且,不是“发送”动词吗?这是否表明该模型没有尽如人意的声明?声明性模型不应该只使用名词吗?

我希望我的模型处于100%声明范围的尽头。为此,我必须简单地声明“是”。我们开始做吧!

什么是节点:

sig Node {}

在任何时候t,一个节点都有数据。

sig Node {
    data: Data -> Time
}

网络在节点之间有电线是什么。

sig Network {
    wire: Node -> Node
}

数据d在时间t和t'之间的线上是什么...

让我停在那里。我勾勒出的第二种方法更具说明性吗?有没有一种更具说明性的方法?

如何以100%声明的方式为网络建模?

1 个答案:

答案 0 :(得分:2)

我认为您需要将模型的语义内容与其中使用的名称分开,这是一个问题。对我而言,声明性模型的本质是它记录观察结果-可能是关于状态或关于动态的事物(例如过渡)的逻辑表达。另一种是操作模型,它是通过建立原始动作序列来描述行为和状态的。一个简单的例子:对从集合中不确定地选择元素的动作建模。操作规范可能会按顺序处理该套装,然后使用循环遍历该套装,在每一步中抛掷硬币,并在首次出现抛头时返回给定元素。这为直观的操作描述建模:“一次遍历一组元素,然后选择一个返回”。声明性规范仅表示返回值是集合的元素-无需赘述。

关于名称在您的特定模型中的使用,似乎更大的问题在于名称是否直接传达了它们的含义。所以send对我来说不是一个很有帮助的名字;更好的是sentAt