Skip to content

Commit df1fe06

Browse files
committed
alpha equality for sharing optimization
1 parent a5d52db commit df1fe06

File tree

4 files changed

+122
-10
lines changed

4 files changed

+122
-10
lines changed

Makefile

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ bench : helf
1313
$(time) $(helf) examples/ltal/w32_sig_semant.elf
1414

1515
current : helf
16-
$(helf) test/succeed/z.elf
16+
$(helf) test/succeed/y.elf
1717

1818
helf :
1919
make -C src helf

src/Abstract.hs

+103-1
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,18 @@
1-
{-# LANGUAGE DeriveFunctor, DeriveFoldable, DeriveTraversable, TypeSynonymInstances #-}
1+
{-# LANGUAGE DeriveFunctor, DeriveFoldable, DeriveTraversable, TypeSynonymInstances, FlexibleInstances, FlexibleContexts, UndecidableInstances #-}
22

33
module Abstract where
44

55
import Prelude hiding (foldr)
66

7+
import Control.Monad.Reader
8+
79
import Data.Set (Set)
810
import qualified Data.Set as Set
911

12+
-- import Data.Map (Map)
13+
-- import qualified Data.Map as Map
14+
import qualified Data.IntMap as M
15+
1016
import Data.Foldable
1117
import Data.Traversable
1218

@@ -104,6 +110,102 @@ appView = loop [] where
104110
loop acc f = (f, acc)
105111
-}
106112

113+
-- * alpha equality
114+
115+
newtype Alpha a = Alpha a
116+
deriving (Functor)
117+
118+
instance Show a => Show (Alpha a) where
119+
show (Alpha a) = show a
120+
121+
instance Ord (Alpha Expr) where
122+
compare (Alpha e) (Alpha e') = aCompare e e'
123+
124+
instance Ord (Alpha a) => Eq (Alpha a) where
125+
a == a' = compare a a' == EQ
126+
-- (Alpha e) == (Alpha e') = aeq e e' Map.empty
127+
128+
type IMap = M.IntMap UID -- map directed from left to right
129+
type Cmp = Reader IMap
130+
131+
class OrdAlpha a where
132+
aCompare :: a -> a -> Ordering
133+
aCompare e1 e2 = runReader (acmp e1 e2) M.empty
134+
135+
-- acmp :: MonadReader IMap m => a -> a -> m Ordering
136+
acmp :: a -> a -> Cmp Ordering
137+
acmp e1 e2 = return $ aCompare e1 e2
138+
139+
instance OrdAlpha Name where
140+
acmp (Name x _) (Name y _)
141+
| x == y = return EQ
142+
| otherwise = do
143+
m <- ask
144+
case M.lookup x m of
145+
Nothing -> return $ compare x y
146+
Just y' -> return $ compare y' y
147+
148+
-- | Just look at UID
149+
instance OrdAlpha Ident where
150+
acmp x y = acmp (name x) (name y)
151+
152+
instance OrdAlpha Expr where
153+
acmp e e' = case (e, e') of
154+
155+
(Ident x, Ident x') -> acmp x x'
156+
(Ident _, _) -> return LT
157+
(_, Ident _) -> return GT
158+
159+
(App f e, App f' e') -> lexM [ acmp f f', acmp e e' ]
160+
(App _ _, _) -> return LT
161+
(_, App _ _) -> return GT
162+
163+
(Pi Nothing a b, Pi Nothing a' b') -> acmp (a,b) (a',b')
164+
(Pi Nothing _ _, _) -> return LT
165+
(_, Pi Nothing _ _) -> return GT
166+
167+
(Pi (Just x) a b, Pi (Just x') a' b') -> lexM
168+
[ acmp a a'
169+
, local (M.insert (uid x) (uid x')) $ acmp b b' ]
170+
(Pi (Just _) _ _, _) -> return LT
171+
(_, Pi (Just _) _ _) -> return GT
172+
173+
(Lam x a e, Lam x' a' e') -> lexM
174+
[ acmp a a'
175+
, local (M.insert (uid x) (uid x')) $ acmp e e' ]
176+
(Lam _ _ _, _) -> return LT
177+
(_, Lam _ _ _) -> return GT
178+
179+
(Typ, Typ) -> return EQ
180+
{-
181+
(Typ, _) -> return LT
182+
(_, Typ) -> return GT
183+
-}
184+
185+
-- | Lexicographic comparison
186+
instance (OrdAlpha a, OrdAlpha b) => OrdAlpha (a,b) where
187+
acmp (a1,b1) (a2,b2) = lexM [acmp a1 a2, acmp b1 b2]
188+
189+
-- | Use only for lists of equal length!
190+
instance (OrdAlpha a) => OrdAlpha [a] where
191+
acmp as bs = lexM $ zipWith acmp as bs
192+
193+
instance (OrdAlpha a) => OrdAlpha (Maybe a) where
194+
acmp Nothing Nothing = return EQ
195+
acmp Nothing (Just _) = return LT
196+
acmp (Just _) Nothing = return GT
197+
acmp (Just a) (Just b) = acmp a b
198+
199+
-- | Lazy lexicographic combination..
200+
lexM :: Monad m => [m Ordering] -> m Ordering
201+
lexM [] = return EQ
202+
lexM (m:ms) = do
203+
o <- m
204+
case o of
205+
LT -> return LT
206+
GT -> return GT
207+
EQ -> lexM ms
208+
107209
-- * Queries
108210

109211
globalIds :: Expr -> Set Ident

src/TermGraph.hs

+11-8
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import Debug.Trace
1717
import Text.PrettyPrint
1818

1919
import ORef
20+
import Abstract (Alpha(..))
2021
import qualified Abstract as A
2122
import Signature
2223
import Util hiding (pretty)
@@ -181,17 +182,17 @@ type TransT a = StateT (TDict a)
181182

182183
-- Direct translation from A.Expr
183184

184-
addPredefs :: MonadTG m => TDict A.Expr -> m (TDict A.Expr)
185+
addPredefs :: MonadTG m => TDict AExpr -> m (TDict AExpr)
185186
addPredefs dict = do
186187
ty <- predefType
187-
return $ Map.insert A.Typ ty dict
188+
return $ Map.insert (Alpha A.Typ) ty dict
188189

189190

190191
trans :: (Signature Term sig, MonadReader sig m, MonadTG m) =>
191192
Env -> A.Expr -> m Term
192193
trans rho e = -- trace ("translating " ++ show e) $ do
193194
evalStateT (transT e) =<< addPredefs
194-
(Map.mapKeysMonotonic (A.Ident . A.Var) rho)
195+
(Map.mapKeysMonotonic (Alpha . A.Ident . A.Var) rho)
195196

196197
{-
197198
-- Translation via BTm
@@ -291,13 +292,15 @@ con x t = Atom (A.Con x) t []
291292
def :: A.Name -> Type -> Term -> Term'
292293
def x t v = Def x t v []
293294

295+
type AExpr = Alpha A.Expr
296+
294297
transT :: (Signature Term sig, MonadReader sig m, MonadTG m) =>
295-
A.Expr -> TransT A.Expr m Term
296-
transT = transG (Right <.> transT')
298+
A.Expr -> TransT AExpr m Term
299+
transT e = transG (Right <.> transT') (Alpha e)
297300

298301
transT' :: (Signature Term sig, MonadReader sig m, MonadTG m) =>
299-
A.Expr -> TransT A.Expr m Term'
300-
transT' e = do
302+
AExpr -> TransT AExpr m Term'
303+
transT' (Alpha e) = do
301304
let (f, sp) = appView e
302305
if null sp then
303306
case f of
@@ -311,7 +314,7 @@ transT' e = do
311314
-- return $ Var n -- only for binding in Lam and Pi
312315
-- A.Typ -> predefType -- impossible case
313316
A.Lam n _ e -> do
314-
x <- transAddBind (A.Ident . A.Var) n
317+
x <- transAddBind (Alpha . A.Ident . A.Var) n
315318
Abs x <$> transT e
316319
-- A.Lam n _ e -> Abs <$> transT (A.Ident $ A.Var n) <*> transT e
317320
A.Pi Nothing a b -> Fun <$> transT a <*> (newORef =<< K <$> transT b)

test/succeed/y.elf

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
%% 2011-11-09
2+
3+
tm : type.
4+
abs : (tm -> tm) -> tm.
5+
6+
eq : tm -> tm -> type.
7+
eq/id : eq (abs [x]x) (abs [y]y).

0 commit comments

Comments
 (0)