-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathAlphaBeta.hs
46 lines (34 loc) · 1.48 KB
/
AlphaBeta.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies #-}
module AlphaBeta where
import Data.List.Extras.Argmax (argmax)
positiveInfinity :: (Num v, Ord v) => v
positiveInfinity = 9999999999999
negativeInfinity :: (Num v, Ord v) => v
negativeInfinity = -positiveInfinity
class MiniMax s a | s -> a where
isTerminal :: s -> Bool
utility :: (Num v, Ord v) => s -> v
successors :: s -> [(a, s)]
decision :: (MiniMax s a) => s -> a
decision = fst . argmax minValueStart . successors
where minValueStart (a, s) = minValue s negativeInfinity positiveInfinity
xValue nextValue initialV state alpha beta
| isTerminal state = utility state
| otherwise = nextValue successors' initialV alpha beta
where successors' = (map snd (successors state))
minValue :: (MiniMax s a, Num v, Ord v) => s -> v -> v -> v
minValue = xValue minValue' positiveInfinity
maxValue :: (MiniMax s a, Num v, Ord v) => s -> v -> v -> v
maxValue = xValue maxValue' negativeInfinity
minValue' :: (MiniMax s a, Num v, Ord v) => [s] -> v -> v -> v -> v
minValue' [] v alpha beta = v
minValue' (s:xs) v alpha beta
| v' <= alpha = v' -- Prune
| otherwise = minValue' xs v' alpha (min beta v')
where v' = min v $ maxValue s alpha beta
maxValue' :: (MiniMax s a, Num v, Ord v) => [s] -> v -> v -> v -> v
maxValue' [] v alpha beta = v
maxValue' (s:xs) v alpha beta
| v' >= beta = v' -- Prune
| otherwise = maxValue' xs v' (max alpha v') beta
where v' = max v $ minValue s alpha beta