我正在尝试在 TLA+ 中模拟David Gries 的咖啡罐问题,但我被困在这一部分:
“你能说最后剩下的豆子的颜色与最初在罐头里的黑豆和白豆的数量有关吗?”
我不知道如何处理这个问题。您能否提供一些建议或提示?(也欢迎提供方法)
这是我在 TLA+ 中的代码:
------------------------------ MODULE CanBean ------------------------------
EXTENDS Naturals, FiniteSets, Sequences
\* filter <- 2 | max_can <- 5
CONSTANT filter, max_can
VARIABLES picked, Can, Whites, Blacks
vars == <<picked, Can, Whites, Blacks>>
IsBlack(i) == i % filter = 0
IsWhite(i) == i % filter /= 0
GetWhite(a,b) == IF IsWhite(a) THEN a ELSE b
GetBlack(a,b) == IF IsBlack(a) THEN a ELSE b
AreBothWhite(a,b) == IsWhite(a) /\ IsWhite(b)
Pick == /\ picked = <<>>
/\ \E a,b \in Can : a/= b /\ picked' = <<a,b>>
/\ UNCHANGED <<Whites, Blacks, Can>>
Process == /\ picked /= <<>>
/\ LET a == picked[1] b == picked[2] IN
/\ \/ AreBothWhite(a,b) /\ Whites' = Whites \ {a,b} /\ \E m \in Nat \cap Can : Blacks' = Blacks \cup { filter * m }
\/ ~AreBothWhite(a,b) /\ Blacks' = Blacks \ { GetBlack(a,b) } /\ UNCHANGED Whites
/\ picked' = <<>>
/\ Can' = Blacks' \cup Whites'
Terminating == /\ Cardinality(Can) = 1
/\ UNCHANGED vars
TypeInvariantOK == /\ \A n \in Can : n \in Nat
/\ LET length == Len(picked)
IN length = 2 \/ length = 0
Init == /\ picked = <<>>
/\ Can = 1..max_can
/\ Blacks = { n \in Can : n % filter = 0 }
/\ Whites = { n \in Can : n % filter /= 0 }
Next == Pick \/ Process \/ Terminating
=============================================================================
\* Modification History
\* Last modified Sun Feb 21 14:53:34 CET 2021
\* Created Sat Feb 20 19:50:01 CET 2021