diff options
| author | bringert <bringert@cs.chalmers.se> | 2005-12-05 16:45:11 +0000 |
|---|---|---|
| committer | bringert <bringert@cs.chalmers.se> | 2005-12-05 16:45:11 +0000 |
| commit | 7c24fcb38faeaada097d2797e9cb0f305dbc637e (patch) | |
| tree | 5bee5bf8b09793d72ba4b8c60d90f3a72f6f7bec /transfer/examples/aggregation/aggregate.tr | |
| parent | 747271941a9e4f698e985d6cb58efe2994e60d61 (diff) | |
Added aggregation example.
Diffstat (limited to 'transfer/examples/aggregation/aggregate.tr')
| -rw-r--r-- | transfer/examples/aggregation/aggregate.tr | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/transfer/examples/aggregation/aggregate.tr b/transfer/examples/aggregation/aggregate.tr new file mode 100644 index 000000000..d7d955bb8 --- /dev/null +++ b/transfer/examples/aggregation/aggregate.tr @@ -0,0 +1,66 @@ +import prelude +import tree + +derive Eq Tree +derive Compos Tree + + +-- When the Transfer compiler gets meta variable inference, +-- we can write: +{- +aggreg : (A : Type) -> Tree A -> Tree A +aggreg _ t = + case t of + ConjS c s1 s2 -> + case (aggreg ? s1, aggreg ? s2) of + (Pred np1 vp1, Pred np2 vp2) | np1 == np2 -> + Pred np1 (ConjVP c vp1 vp2) + (Pred np1 vp1, Pred np2 vp2) | vp1 == vp2 -> + Pred (ConjNP c np1 np2) vp1 + (s1',s2') -> ConjS c s1' s2' + _ -> composOp ? ? ? ? aggreg t +-} + +-- Adding hidden arguments, we could write something like: +{- +aggreg : (A : Type) => Tree A -> Tree A +aggreg t = + case t of + ConjS c s1 s2 -> + case (aggreg s1, aggreg s2) of + (Pred np1 vp1, Pred np2 vp2) | np1 == np2 -> + Pred np1 (ConjVP c vp1 vp2) + (Pred np1 vp1, Pred np2 vp2) | vp1 == vp2 -> + Pred (ConjNP c np1 np2) vp1 + (s1',s2') -> ConjS c s1' s2' + _ -> composOp aggreg t +-} + + +-- For now, here's what we have to do: + +aggreg : (A : Type) -> Tree A -> Tree A +aggreg _ t = + case t of + ConjS c s1 s2 -> + case (aggreg ? s1, aggreg ? s2) of + (Pred np1 vp1, Pred np2 vp2) | eq_NP np1 np2 -> + Pred np1 (ConjVP c vp1 vp2) + (Pred np1 vp1, Pred np2 vp2) | eq_VP vp1 vp2 -> + Pred (ConjNP c np1 np2) vp1 + (s1',s2') -> ConjS c s1' s2' + _ -> composOp ? ? compos_Tree ? aggreg t + + +-- aggreg specialized for Tree S +aggregS : Tree S -> Tree S +aggregS = aggreg S + +-- equality specialized for Tree NP +eq_NP : Tree NP -> Tree NP -> Bool +eq_NP = eq NP (eq_Tree NP) + +-- equality specialized for Tree VP +eq_VP : Tree VP -> Tree VP -> Bool +eq_VP = eq VP (eq_Tree VP) + |
