我对合金很新,目前正在阅读mit的教程。我对事物的逻辑有点困惑。我正在尝试做的一件非常基本的事情就在下面。
当我运行以下内容时,每个人都具有相同的技能(所有技能),每项任务都需要相同的技能(所有技能)。人们至少每人分配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
答案 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.assigned
或all 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
}