diff options
-rw-r--r-- | Term.hs | 19 |
1 files changed, 10 insertions, 9 deletions
@@ -20,6 +20,7 @@ module Term ( import Data.List import qualified Data.Set as Set +import qualified Data.Map as Map import TypeVar @@ -51,27 +52,27 @@ instance Eq Term where alphaEquiv :: Term -> Term -> Bool alphaEquiv a b = - let equiv = \term1 term2 varmap -> + let equiv = \term1 term2 varmap1 varmap2 depth -> case (term1,term2) of (TConst a1 b1, TConst a2 b2) -> a1 == a2 && b1 == b2 (TApp a1 b1, TApp a2 b2) -> - equiv a1 a2 varmap && - equiv b1 b2 varmap + equiv a1 a2 varmap1 varmap2 depth && + equiv b1 b2 varmap1 varmap2 depth (TAbs (TVar (Var name1 type1)) b1, TAbs (TVar (Var name2 type2)) b2) -> type1 == type2 && - equiv b1 b2 newmap - where newmap = ((Var name1 type1),(Var name2 type2)) : varmap + equiv b1 b2 newmap1 newmap2 (depth+1) + where newmap1 = Map.insert (Var name1 type1) depth varmap1 + newmap2 = Map.insert (Var name2 type2) depth varmap2 (TVar a1, TVar a2) -> - -- the order of the pair is important - (a1,a2) `elem` varmap || - a1 == a2 && not ((a1,a2) `elem` varmap) + a1 == a2 && Map.notMember a1 varmap1 && Map.notMember a2 varmap2 || + Map.lookup a1 varmap1 == Map.lookup a2 varmap2 (_,_) -> False - in equiv a b [] + in equiv a b Map.empty Map.empty 0 alphaConvert :: Term -> Term -> Term |