// 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)