% A simplified version of the Missionaries and Cannibals puzzle
% This has only missionaries (i.e. no cannibals) and a boat
% which may hold two at a time.

%  This module is very similar to BRIEFCASE

include "../library-ontology"
include "../library"

sorts
   RiverBank;

inclusions
   RiverBank << Accumulator;

% Maximum number of missionaries
numeric_symbol MaxMiss=9

% Maximum capacity of the boat
numeric_symbol MaxBoatCapacity=5

module MISSIONARIES;

  objects
    M : Resource;
    P1, P2 : Place;
    Bank1, Bank2 : RiverBank;
    Boat : Accumulator;

  actions
    Board(1..MaxMiss, RiverBank); 
    Disembark(1..MaxMiss, RiverBank);
    CrossTo(Place);

  variables
    n : 1..MaxMiss;
    b : RiverBank;
    p : Place;

  import TRANSFER;
    Transfer(n,M,b,Boat) is Board(n,b);
      
  import TRANSFER;
    Transfer(n,M,Boat,b) is Disembark(n,b);

  import MOVE;
    Move(Boat,p) is CrossTo(p);

  import NOCONCURRENCY;

  axioms
    Location(Bank1)=P1;
    Location(Bank2)=P2;

    % The boat can carry at most five
    constraint -(Amount(M,Boat)=n & MaxBoatCapacity < n); 

    nonexecutable CrossTo(p) if Amount(M,Boat)=0;
