summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJed Barber <jjbarber@y7mail.com>2012-05-15 18:02:02 +1000
committerJed Barber <jjbarber@y7mail.com>2012-05-15 18:02:02 +1000
commite438502b5fbbfa22d73927daaa0d93dc650a033b (patch)
tree26893afec0d7f24e93866e09c27b71c2fa6c9d42
parentb61bbffd091c2dee309ef0e0a33d13a9b130c18d (diff)
Fixed alphaEquiv, again
-rw-r--r--Term.hs19
1 files changed, 10 insertions, 9 deletions
diff --git a/Term.hs b/Term.hs
index 5067c1a..20c70ce 100644
--- a/Term.hs
+++ b/Term.hs
@@ -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