The diagram below is the program written in Circus.
![]() |
| The Circus Crossing Program |
\documentclass{article}
%
\usepackage{circus}
%
\begin{document}
\begin{zsection}
\SECTION\ CrossingPuzzle \parents\ circus\_toolkit
\end{zsection}
\begin{zed}
DFR ::= F1 | F2 | F3 | R1 | R2 | R3 | Z \\
F == \{F1, F2, F3\} \\
R == \{R1, R2, R3\} \\
FR == F \cup R \\
\end{zed}
\begin{circus}
\circchannel\ move2: FR \cross FR \\
\circchannel\ move1: FR \\
\circchannel\ load: FR \\
\circchannel\ escape \\
\end{circus}
\begin{circus}
\circprocess\ Cross \circdef \circbegin \\
\t1 \circstate\ State == [~ ls: \power~FR; boat:
\power~FR; rs: \power~FR | (\#~boat \leq 2) \land
% for ls or rs, if there exists rabbits, the number
% of foxes shall be less than the number of rabbits
(
(
(\#~(ls \cap F) \leq \#~(ls \cap R))
\land (\#~(ls \cap R) > 0)
) \lor (\#~(ls \cap R) = 0)
) \land
(
(
(\#~(rs \cap F) \leq \#~(rs \cap R))
\land (\#~(rs \cap R) > 0)
) \lor (\#~(rs \cap R) = 0)
)
~] \\
\t1 Init == [~ (State)' | ls' = FR \land rs' = \emptyset
\land boat' = \emptyset ~] \\
% move two creatures frm LS to RS
\t1 Move2 == [~ \Delta State; c1?: FR; c2?: FR |
c1? \in ls \land c2? \in ls \land
c1? \neq c2? \land
boat = \emptyset \land
ls' = ls \setminus \{c1?, c2?\} \land
boat' = \{c1?, c2?\} \land rs'=rs
~] \\
% move one creature frm LS to RS because there is a creature on boat
\t1 Move1 == [~ \Delta State; c?: FR |
c? \in ls \land (\#~boat = 1) \land
ls' = ls \setminus \{c?\} \land
boat' = boat \cup \{c?\} \land rs'=rs
~] \\
% load one and back another
\t1 LoadBack == [~ \Delta State; c?: FR |
c? \in boat \land (\#~boat = 2) \land
ls \neq \emptyset \land
ls' = ls \land boat' = boat \setminus \{c?\} \land
rs'=rs \cup \{c?\}
~] \\
% load two
\t1 LoadAll == [~ \Delta State |
(\#~boat = 2) \land ls = \emptyset \land
boat' = \emptyset \land rs'=rs \cup boat
~] \\
\t1 AMove \circdef (
(\lcircguard boat = \emptyset \rcircguard \circguard
move2?c1?c2 \then \lschexpract Move2 \rschexpract)
\extchoice
(\lcircguard \#~boat = 1 \rcircguard \circguard
move1?c \then \lschexpract Move1 \rschexpract)
\extchoice
(\lcircguard ls \neq \emptyset \land \#~boat = 2 \rcircguard
\circguard load?c \prefixcolon (c \in boat) \then
\lschexpract LoadBack \rschexpract)
\extchoice
(\lcircguard ls = \emptyset \land \#~boat = 2 \rcircguard
\circguard \lschexpract LoadAll \rschexpract)
) \\
\t1 AEnd \circdef (\lcircguard (ls = \emptyset \land boat = \emptyset)
\rcircguard \circguard escape \then \Skip) \\
%
\t1 \circspot \lschexpract Init \rschexpract \circseq (
\circmu X \circspot (((AMove) \circseq X) \extchoice AEnd)) \\
\circend
\end{circus}
\end{document}

No comments :
Post a Comment