/*
* A second attempt
*
*/
// 0 = originalside 1 = goalside
bit farmer;
bit goat;
bit cabbage;
bit wolf;
init
{
farmer = 0;
goat = 0;
cabbage = 0;
wolf = 0;
run Solve();
}
proctype Solve()
{
do
// the goat does not want to be with the wolf and the cabbage will be eaten
:: !farmer && !(!goat && (!wolf || !cabbage)) ->
farmer = 1;
printf("The farmer moved to the other shore\n");
:: !goat && !farmer ->
atomic{
goat = 1;
farmer = 1;
}
printf("The farmer and the goat moved to the other shore\n");
//if the wolf or the goat is on the other shore it is safe to move the cabbage
:: !cabbage && !farmer && (wolf || goat) ->
atomic{
cabbage = 1;
farmer = 1;
}
printf("The farmer and the cabbage moved to the other shore\n");
// if the goat or the cabbage is on the other shore it is safe to move the wolf
:: !wolf && !farmer && (goat || cabbage) ->
atomic {
wolf = 1;
farmer = 1;
}
printf("The wolf and the farmer moved to the other shore\n");
:: farmer && !(goat && (wolf || cabbage))->
printf("The farmer moved to the original shore\n");
farmer = 0;
:: goat && farmer ->
atomic {
goat = 0;
farmer = 0;
}
printf("The farmer and the goat moved to the original shore\n");
// if the wolf or goat is on the other shore it is safe to move the cabbage
:: cabbage && farmer && !(!wolf || !goat) ->
atomic {
cabbage = 0;
farmer = 0;
}
printf("The farmer and the cabbage moved to the original shore\n");
// if the cabbage or the goat is on the other shore the wolf is safe to be moved
:: wolf && farmer && (!goat || !cabbage) ->
atomic {
wolf = 0;
farmer = 0;
}
printf("The wolf and the farmer moved to the orignial shore\n");
:: farmer && wolf && cabbage && goat ->
printf("We are done!\n");
end: break; //done
od
}
active proctype Monitor()
{
// check that we accidently haven't violated anything
assert(true)
}