合金初学者的概念

时间:2012-11-01 09:44:55

标签: alloy

我对合金很新,目前正在阅读mit的教程。我对事物的逻辑有点困惑。我正在尝试做的一件非常基本的事情就在下面。

  • 一个人最多只能完成一项任务
  • 任务最多可由1人完成
  • 一个人只能做他/她能够做的事

当我运行以下内容时,每个人都具有相同的技能(所有技能),每项任务都需要相同的技能(所有技能)。人们至少每人分配1个任务,但有时他们会完成相同的任务。

提前致谢

some sig Skills{ }


some sig Person  {
 has:  some Skills, 
 assigned: lone Task
 }

some sig Task
 {  
 requires: some Skills
 }
 {
// everyone must have the required task skills for assignment
 all p:Person | p.has= requires
 }

pred Valid ()
 {  
//everyone must be assigned to single task
  all p:Person | lone t:Task| p.assigned in t
// no one can have the same task
  no p1:Person , p2:Person | p1.assigned not in p2.assigned
 }

run Valid

1 个答案:

答案 0 :(得分:0)

您的模型中有许多不正确的事情。

  
      
  • 一个人最多只能完成一项任务
  •   

要实现此功能,lone签名中assigned字段的Person多重性修饰符就足够了。如果您希望每个人分配一个任务,则可以将lone更改为one

  
      
  • 任务最多可由1人完成
  •   

Valid谓词中的约束是错误的,因为您应该写p1.assigned not in p2.assigned而不是p1.assigned = p2.assigned,以便说没有两个人分配了相同的任务。此外,您应添加一个确保p1 != p2的约束。或者,您可以写all p1, p2: Person | p1 != p2 implies p1.assigned != p2.assigned。最后,为了避免在量词体中编写p1 != p2,您可以使用disj关键字来说明,例如no disj p1, p2: Person | p1.assigned = p2.assignedall disj p1, p2: Person | p1.assigned != p2.assigned

  
      
  • 一个人只能做他/她能够
  • 的事情   

Task签名的附加事实部分中的约束是错误的,因为它根本没有提到assigned字段,这是你必须要做的就是说 对于每个人和分配给他们的任务,该人员具有该任务所需的所有技能。你所写的意味着,对于每项任务,每个人都拥有该任务所需的所有技能。满足这一要求的唯一方法是,如果所有任务都具有相同的技能,这正是您在为模型获得的所有实例中注意到的。

以下是我对此进行建模的方法(注意字段和签名名称的细微变化,这使得模型更具可读性和可理解性):

some sig Skill {}

some sig Person  {
    hasSkill:  some Skill, 
    assignedTask: lone Task
}

some sig Task {  
    requiredSkills: some Skill
}

// everyone must have the required skills for the assigned task
fact requiredTaskSkills {
    all p:Person | p.hasSkill in p.assignedTask.requiredSkills
}

// everyone has at least one assigned task
pred atLeastOneTask {
    all p: Person | one p.assignedTask
}

// no two persons can have the same task assigned 
pred uniqueTaskAssignments {
    no disj p1, p2: Person | p1.assignedTask = p2.assignedTask
}    

run { 
    atLeastOneTask and uniqueTaskAssignments
}