From 7c24fcb38faeaada097d2797e9cb0f305dbc637e Mon Sep 17 00:00:00 2001 From: bringert Date: Mon, 5 Dec 2005 16:45:11 +0000 Subject: Added aggregation example. --- transfer/examples/aggregation/aggregate.tr | 66 ++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 transfer/examples/aggregation/aggregate.tr (limited to 'transfer/examples/aggregation/aggregate.tr') 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) + -- cgit v1.2.3