
data PictValue =  ValInt Int | ValChan Name | ValTuple [PictValue]
  deriving (Show,Eq)

data Name = Name Int
  deriving (Show, Eq)

data Pattern = PatVar Name | PatTuple [Pattern]
  deriving (Show, Eq)

-- inserire i tipi di dato sopra definiti nella classe Eq
-- e' indispensabile affinche' si possa definire la funzione patMatch


type Binding = Name -> (Maybe PictValue)




patMatch :: Pattern -> PictValue -> Binding

patMatch (PatVar (Name n)) val (Name m) | (n == m)   =  (Just val)
                                        | otherwise  =  Nothing

patMatch (PatTuple []) (ValTuple []) (Name m) = Nothing

patMatch (PatTuple (p:ps)) (ValTuple (v:vs)) n = (union (patMatch p v) (patMatch (PatTuple ps) (ValTuple vs)) n)

patmatch _ _ _ = error "patter matching failure"





myPattern = PatTuple [PatTuple [], PatTuple [PatVar (Name 3), PatVar (Name 4)]]
-- corresponding to the pattern [[] [x3 x4]]

myValue   = ValTuple [ValTuple [], ValTuple [ValTuple [ValInt 1,ValInt 2], ValChan (Name 4)]]
-- corresponding to the value [[] [[1 2] x4]]

myPattern2 = PatTuple [PatTuple [], PatTuple [PatVar (Name 3), PatVar (Name 4), PatVar (Name 5)]]
-- corresponding to the pattern [[] [x3 x4 x5]]


myBinding = patMatch myPattern myValue

