We provide here a collection of examples of interaction models taken from our test cases, based on areas such as bioinformatics, business and emergency response.

Playing Blackjack

//  Written By Paolo Besana
// -----------------------------------------------------------------------------------
// Player clauses

a(player(TotalMoney, LeftMoney),IDplr)::
null <- wager(Wager,TotalMoney) 
then
openingcards(Cards) <= a(dealer_starter(_,_), IDdlr)  
then
dealercard(OpenCard) <= a(dealer_starter(_,_), IDdlr)
then
a(player_strategy(Cards, OpenCard, Wager), IDplr).
then
(
 (
  win(Prize) <= a(dealer_end(_,_),IDdlr)
  then
  null <- LeftMoney = TotalMoney + Prize
 )
 or
 (
  ask(Amount) <= a(dealer_end(_,_),IDdlr)
  then
  null <- LeftMoney = TotalMoney - Amount
 )
 or
(
 push() <= a(dealer_end(_,_), IDdlr)
)

a(player_strategy(Cards,OpenCard,Wager,Depth), IDplr) ::
(
 bust(Cards,Wager) => a(dealer_waiter, IDdlr) <- 
				       greaterThan(sum(Cards), 21)
)
or
(
null <- makeDecision(Cards, OpenCard, Wager, Decision)
then
(
 (
  a(player_hit(Cards, NewCard), IDplr) <- equal(Decision, hit)
  then
  a(player_strategy([NewCard|Cards], OpenCard, Wager, Depth+1), IDplr)
 )	 
 or
 (
  a(player_double_down(Cards,Wager),IDplr) <- 
		equal(Decision, double_down)
 )
 or
 (
  surrender(Wager) => a(dealer_waiter(_), IDdlr) <- 
		      equal(Decision, surrender)
 )
 or
 (
  stand(Cards,Wager) => a(dealer_waiter, IDdlr) 
 )
)
)




a(player_hit(Cards, NewCard), IDplr) ::
hit() => a(dealer_waiter(_), IDdlr) 
then
card(Card) <= a(dealer_waiter(_), IDdlr)
then
a(player_strategy([Card|Cards], OpenCard, Wager), IDplr)


a(player_double_down(Cards,Wager),IDplr) ::
 double_down() => a(dealer_waiter(_), IDdlr) 
 then
 card(Card) <= a(dealer_waiter(_), IDdlr)
 then
 null <- NewCards = [Card|Cards]
 then
 (
   bust(NewCards,2*Wager) => a(dealer_waiter, IDdlr) <- 
			     greaterThan(sum(NewCards), 21)
   or
   stand(NewCards, 2*Wager) => a(dealer_waiter, IDdlr)
 )	 

% -----------------------------------------------------------------------------------
% Dealer clauses

a(dealer(Players, Cards), IDdlr)::
null <- Cards = [OpenCard|TailCards1] and 
	TailCards1 = [HiddenCards|TailCards2]
then
a(dealer_starter([OpenCard,HiddenCard], Players, 
			TailCards2, NewCards), IDdlr) 
then
a(dealer_waiter(NewCards, RestOfCards, Players, PlayerResults), IDdlr) 
then
a(dealer_game([OpenCard,HiddenCard], MyNewCards, Cards), IDdlr)
then
a(dealer_end(MyNewCards, PlayerResults), IDdlr)	


a(dealer_starter([OpenCard,HiddenCard], Players, Cards, NewCards), IDdlr) ::
(
 null <- Players = [IDP|PlayersTail]
 then
 openingcards([Card1, Card2]) => a(player,IDP) <- 
		      Cards = [Card1|TailCard1] and 
 TailCards1 = [Card2|RemainingCards]
 then
 dealercard(OpenCard) => a(player, IDP) 
 then 
 a(dealer_starter([OpenCard,HiddenCard], PlayersTail, 
			RemainingCards, NewCards), IDdlr)
)
or
(
null <- Players == [] and NewCards = RemainingCards
)


a(dealer_waiter(Cards, RestOfCards, Players, PlayerResults), IDdlr) ::
(
 null <- playerRemaining(Players,PlayerResults)
 then
 hit() <= a(player_hit(_,_,_), IDP) 
 then
 card(Card) => a(player_hit(_,_,_), IDP) <- Cards = [Card|RemainingCards]
 then 
 a(dealer_waiter(RemainingCards,RestOfCards, Players,PlayerResults)
)
or
(
 null <- playerRemaining(Players,PlayerResults)
 then
 bust(Cards,Wager) <= a(player_strategy(_,_), IDP) 
 then
 a(dealer_game(Cards, RestOfCards, Players, 
		      [(IDP,bust,_,Wager)|PlayerResults]), IDdlr)
)
or 
( 
 null <- playerRemaining(Players,PlayerResults)
 then
 stand(Cards, Wager) <= a(player_strategy(_,_), IDP) 
 then
 a(dealer_game(Cards, RestOfCards, Players, 
		      [(IDP,stand,Cards,Wager)|PlayerResults]), IDdlr)
)
or
( 
 null <- playerRemaining(Players,PlayerResults)
 then
 double_down() <= a(player_double_down(_,_), IDP) 
 then
 card(Card) => a(player_double_down(_,_), IDP) <- 
	       Cards = [Card|RemainingCards]
 then
 (
  bust(Cards,Wager) <= a(player_double_down(_,_), IDP)
  then
  a(dealer_game(RemainingCards, RestOfCards, Players, 
		[(IDP,bust,Cards,Wager)|PlayerResults]), IDdlr)
 )
 or
 (
  stand(Cards, Wager) <= a(player_double_down(_,_), IDP) 
  then
  a(dealer_game(Cards, RestOfCards, Players, 
		       [(IDP,stand,Cards,Wager)|PlayerResults]), IDdlr)
 )
)
or
(
 null <- playerRemaining(Players,PlayerResults)
 then
 surrender(Wager) <= a(player_strategy(_,_), IDP) 
 then
 a(dealer_game(Cards, RestOfCards, Players, 
		      [(IDP,surrender,_,Wager)|PlayerResults])
)
or
(
 null <- not playerRemaining(Players,PlayerResults) and 
	     (RestOfCards = Cards)
)




a(dealer_game(MyCards, MyNewCards, Cards),IDdlr)::
(
 null <- greaterThan(sum(Cards), 21) and MyNewCards = MyCards
)
or 
(
 null <- greaterThan(sum(MyCards), 17) and 
      evaluate_stand(MyCards) and MyNewCards = MyCards
)
or
(
 a(dealer_game([NewCard|MyCards], MyNewCards, TailCards), IDdlr) <- 
	Cards = [NewCard|TailCards] 
)
	

a(dealer_end(MyCards,PlayerResults),IDdlr) ::
null <- PlayerResults = [(IDP, Res, Cards, Wager) | PlayerTail]
then
(
 ask(Wager) => a(player(_), IDP) <- Res == bust
 or
 ask(Wager/2) => a(player(_), IDP) <- (Res == surrender)
 or
 ask(Wager) => a(player(_), IDP) <- (Res == stand) and 
	    lessOrEqualThan(sum(MyCards), 21)  and 
 graterThan(sum(MyCards), sum(Cards))	 
 or
 push() => a(player(_), IDP) <- (Res == stand) and 
	(sum(MyCards) == sum(Cards))
 or
 win(Wager) => a(player(_), IDP) <- (Res == stand) and 
	    greaterThan(sum(MyCards), 21)
 or
 win(2*Wager/3) => a(player(_), IDP) <- (Res == stand) and 
		lessThan(sum(MyCards), sum(Cards))
)
then 
a(dealer_end(MyCards,PlayerTail),IDdlr)