के साथ एक लाइटबुल प्रदान करना 100 prisoners and a lightbulb समस्या को हल करने के लिए मानक रणनीति पर विचार करें।100 कैदी और डेफनी
method strategy<T>(P: set<T>, Special: T) returns (count: int)
requires |P| > 1 && Special in P
ensures count == (|P| - 1)
decreases *
{
count := 0;
var I := {};
var S := {};
var switch := false;
while (count < (|P|-1))
invariant count <= (|P|-1)
invariant count > 0 ==> Special in I
invariant Special !in S && S < P && S <= I && I <= P
decreases *
{
var c :| c in P;
I := I + {c};
if c == Special {
if switch == true {
switch := false;
count := count + 1;
}
} else {
if c !in S && switch == false {
S := S + {c};
switch := true;
}
}
}
assert(I == P);
}
यह विफल रहता है, फिर भी, साबित होता है कि अंत I == P
में: यहाँ Dafny में यह मॉडल करने के लिए मेरे प्रयास है। क्यूं कर? मैं शायद आगे भी पाश अपरिवर्तनीय को मजबूत करने की जरूरत है, लेकिन जहां से शुरू करने के लिए कल्पना नहीं कर सकते ...