为什么没有为谓词找到实例? (合金)

时间:2014-05-17 23:47:38

标签: instance predicate alloy

我是Alloy的新手,我正在努力使这个谓词起作用,但我不知道问题出在哪里。用户可以参加聚会或在候选资格期间创建,州长是宣布选举和候选资格的人,用户可以投票给一方,并对来自该方的候选人提出三个偏好。我不知道为什么它找不到实例。你能救我吗?

module Politics

abstract sig Document{ }
abstract sig Photo{ }


sig Party{
id:one Int,
name:one String,
program:one Document,
symbol :one Photo,
CreateDate: one Int
}{CreateDate>Election.startCandidacy
CreateDate<Election.EndCandidacy}

sig User{
id: one Int,
name: one String,
surname: one String,
email: one String,
password: one String,
dateBirth: one Int,
vote: lone Vote
}

sig Governor extends User{
election:one Election,
}{vote != none}

abstract sig Candidate extends User{
cv: one Document,
motLetter: one Document,
party: one Party,
dateCand : one Int
}{cv !=motLetter
vote != none
dateCand > Election.startCandidacy
dateCand < Election.EndCandidacy}


one sig Election{
startCandidacy:one Int,
EndCandidacy:one Int,
dateElection: one Int
}{startCandidacy < EndCandidacy
 dateElection>EndCandidacy}

sig Vote{
dateVote: one Int,
preference1: one Candidate,
preference2: lone Candidate,
preference3: lone Candidate
}{preference1 != preference2 
 preference1 != preference3
 preference2 != preference3
 dateVote = Election.dateElection}

// Facts
// Every user has a unique ID and username
fact noTwoUsersWithSameID{
no disj u1, u2 : User | u1.id = u2.id || u1.email = u2.email
}

// Every party is unique, with unique name, program and symbol
fact noTwoSameParties{
no disj p1, p2 : Party | p1.name = p2.name || p1.program = p2.program || p1.symbol      = p2.symbol
}

// Every candidate has a unique cv and motivation letter
fact noTwoSameCandidates{
no disj c1, c2 : Candidate | c1.cv = c2.cv || c1.motLetter = c2.motLetter
}


// All preferences in the vote are on the same party
fact AllPreferencesSameParty{
all v: Vote | v.preference1.party =  v.preference2.party and  v.preference1.party =  v.preference3.party
 }


fact noSameVotes{
no disj u1, u2:User | u1.vote = u2.vote
all v:Vote | one u:User | u.vote = v
}


assert NoSameUsers{
no disj u1, u2 : User | u1.id = u2.id || u1.email = u2.email
} 


check NoSameUsers for 4

pred show()
{
#Election > 1
//#Party > 3
#Candidate > 8
#User > 10
}


run show for 12

1 个答案:

答案 0 :(得分:1)

你走在正确的轨道上。

您的示例显示您已经尝试过一种简单的方法来确定为什么没有找到实例:放宽约束以查看哪个约束导致模型不被实例化。具体来说,您已对show谓词的一部分进行了注释。

如果你做了更多的事情,你会发现,如果你在show中注释所有约束,那么它就会变成空洞,Alloy会找到实例。如果您一个接一个地引入约束,那么当且仅当约束show被注释掉时,您才会发现#Election > 1是可以满足的。

这应引导你注意选举宣言,其形式为one sig Election { ... }。您现在看到为什么没有找到show的实例吗?没有实例可以同时满足有多个选举的约束以及只有一个选举的约束。

一般来说,如果你学会减少对整数的依赖以获得独特性和对事件进行排序,我认为你会对Alloy更开心。合金原子有时称为对象标识,因此它们不需要具有用于记账目的的唯一标识符。