egison-4.0.0: sample/mahjong.egi
--
--
-- Mah-jong example
--
--
--
-- Matcher definitions
--
suit :=
algebraicDataMatcher
| wan
| pin
| sou
honor :=
algebraicDataMatcher
| ton
| nan
| sha
| pe
| haku
| hatsu
| chun
tile :=
algebraicDataMatcher
| num suit integer
| hnr honor
--
-- Pattern modularization
--
twin := \pat1 pat2 => ($pat & ~pat1) :: #pat :: ~pat2
shuntsu :=
\pat1 pat2 =>
(num $s $n & ~pat1) :: num #s #(n + 1) :: num #s #(n + 2) :: ~pat2
kohtsu := \pat1 pat2 => ($pat & ~pat1) :: #pat :: #pat :: ~pat2
--
-- A function that determines whether the hand is completed or not.
--
complete? :=
\match as multiset tile with
| twin
$th_1
(shuntsu $sh_1
(shuntsu $sh_2
(shuntsu $sh_3 (shuntsu $sh_4 [] | kohtsu $kh_1 [])
| kohtsu $kh_1 (kohtsu $kh_2 []))
| kohtsu $kh_1 (kohtsu $kh_2 (kohtsu $kh_3 [])))
| kohtsu $kh_1 (kohtsu $kh_2 (kohtsu $kh_3 (kohtsu $kh_4 []))))
(twin $th_2 (twin $th_3 (twin $th_4 (twin $th_5 (twin $th_6 (twin $th_7 []))))))
-> True
| _ -> False
--
-- Demonstration code
--
assertEqual "mahjong 1"
(complete?
[ Hnr Haku, Hnr Haku
, Num Wan 3, Num Wan 4, Num Wan 5
, Num Wan 6, Num Wan 7, Num Wan 8
, Num Pin 2, Num Pin 3, Num Pin 4
, Num Sou 6, Num Sou 6, Num Sou 6 ])
True
assertEqual "mahjong 2"
(complete?
[ Hnr Haku, Hnr Haku
, Num Pin 1, Num Pin 3, Num Pin 4
, Num Wan 6, Num Wan 7, Num Wan 8
, Num Wan 3, Num Wan 4, Num Wan 5
, Num Sou 6, Num Sou 6, Num Sou 6 ])
False