Logic 合金约束规范

Logic 合金约束规范,logic,alloy,logic-programming,Logic,Alloy,Logic Programming,我用Alloy编写了以下代码块: one h: Human | h in s.start => { s'.currentCall = h.from } 我想从一组人(s.start)中选择一个“人”,并将一个变量(s.currentCall)设置为等于h.from。 然而,我认为这段代码是在说:在s.start中只有一个人,在哪里 s'.currentCall = h.from 这是真的。 我的假设正确吗?我该如何解决这个问题呢?你完全正确,一个量词的意思是,给定域(集合)中只

我用Alloy编写了以下代码块:

one h: Human | h in s.start => {
    s'.currentCall = h.from
}
我想从一组人(s.start)中选择一个“人”,并将一个变量(s.currentCall)设置为等于h.from。 然而,我认为这段代码是在说:在s.start中只有一个人,在哪里

s'.currentCall = h.from
这是真的。
我的假设正确吗?我该如何解决这个问题呢?

你完全正确,
一个
量词的意思是,给定域(集合)中只有一个元素,因此量词体是正确的

关于从集合中选择一个元素并将其字段值设置为某个值的原始目标:这听起来像是一个强制性的更新,而您不能直接在Alloy中这样做;Alloy是完全声明性的,因此您只能断言关于有界话语世界的集合和关系的逻辑语句

如果您只需将
one
更改为
some
,并将含义更改为conjunction,然后运行分析(一个简单的
run
命令以查找有效实例),合金分析器将找到一个模型,其中值
s.currentCall
对于某些(任意)等于
h.from
h
来自
s.start

pred p[s, s': S] {
  some h: s.start | s'.currentCall = h.from
}

run p
我希望这就是你想要实现的