[英]Why there is no instance found for the 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
您走在正確的軌道上。
您的示例表明,您已經嘗試了一種簡單的方法來弄清為什么找不到實例:放寬約束以查看哪個約束導致無法實例化模型。 具體來說,您已注釋掉部分show
謂詞。
如果您做更多的事情,您會發現,如果注釋掉show
所有約束,那么它將變成空虛,合金將找到實例。 如果你通過一個帶約束回來一個,你會發現, show
的時候是滿足的,只有當,約束#Election > 1
被注釋掉。
這應該引起您對選舉聲明的注意,該聲明采用one sig Election { ... }
的形式。 您是否現在知道為什么找不到show
實例? 沒有任何一個實例可以同時滿足一個以上選舉的約束和一個正好一個選舉的約束。
總的來說,如果您學會減少對整數的唯一性和排序事件的依賴,我會對Alloy更滿意。 合金原子有時具有對象身份,因此出於簿記目的,它們不需要具有唯一的標識符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.