data Vehicle
    = Car LicensePlate
    | Truck LicensePlate Weight
      deriving Show

type LicensePlate = String
type Weight = Int

vehicles :: [Vehicle]
vehicles = [Car "5FOO042", Truck "7N348672" 3000, Car "5BAR023"]

cars :: [Vehicle] -> [LicensePlate]
cars [] = []
cars ((Car lic):rest) = lic : cars(rest)
cars ((Truck lic w):rest) = cars(rest)

--                                                                              
data ParseTree
    = Program [Expression] Statement
    | Assignment Expression Expression
    | Write Expression
    | CompoundStatement [Statement]
    | Integer Int
    | Identifier String
    | Addition Expression Expression
      deriving Show

type Statement = ParseTree
type Expression = ParseTree

p1 :: ParseTree
p1 = (Program [Identifier "a", Identifier "b"]
      (CompoundStatement [Assignment (Identifier "a") (Integer 3),
	 	 	  Assignment (Identifier "b") 
	                             (Addition (Identifier "a") (Integer 1))]))

used :: ParseTree -> [String]
used(Program declarations statement) = used(statement)
used(CompoundStatement statements) = foldr1 (++) (map used statements)
used(Assignment (Identifier a) r) = a : used(r)
used(Write r) = used(r)
used(Integer i) = []
used(Identifier s) = [s]
used(Addition e1 e2) = used(e1) ++ used(e2)

-- undeclared :: Program -> [String]
-- undeclared(Program 
