summaryrefslogtreecommitdiff
path: root/grammars/numerals/Nat.gf
diff options
context:
space:
mode:
authoraarne <unknown>2003-10-08 14:14:09 +0000
committeraarne <unknown>2003-10-08 14:14:09 +0000
commitddd103ccd7422c35b5af0bcb5bad5edd49b080bb (patch)
treeaaec83676e940efff5c059d17b202756a8057572 /grammars/numerals/Nat.gf
parenta979508aa75a3f2b93072d214ca9c75ed874a39c (diff)
examples for transfer
Diffstat (limited to 'grammars/numerals/Nat.gf')
-rw-r--r--grammars/numerals/Nat.gf55
1 files changed, 55 insertions, 0 deletions
diff --git a/grammars/numerals/Nat.gf b/grammars/numerals/Nat.gf
new file mode 100644
index 000000000..6209eb216
--- /dev/null
+++ b/grammars/numerals/Nat.gf
@@ -0,0 +1,55 @@
+-- Unary and binary natural numbers, and conversions between them. AR 8/10/2003
+-- To be used as an example of transfer.
+
+abstract Nat = {
+
+ cat Nat ;
+ fun
+ One : Nat ; -- 1
+ Succ : Nat -> Nat ; -- n'
+ data Nat = One | Succ ;
+
+ cat Bin ;
+ fun
+ BOne : Bin ; -- 1
+ BX : Bin -> Bin ; -- b 0
+ BXPlus : Bin -> Bin ; -- b 1
+ data Bin = BOne | BX | BXPlus ;
+
+ fun succ : Bin -> Bin ;
+ def
+ succ BOne = BX BOne ;
+ succ (BX b) = BXPlus b ;
+ succ (BXPlus BOne) = BX (BX BOne) ;
+ succ b = succAux b (lastZero b) ;
+
+ fun lastZero : Bin -> Nat ;
+ def
+ lastZero (BX _) = One ;
+ lastZero (BXPlus b) = Succ (lastZero b) ;
+
+ fun succAux : Bin -> Nat -> Bin ;
+ def
+ succAux (BXPlus b) One = BX (succ b) ;
+ succAux (BXPlus b) (Succ n) = BX (succAux b n) ;
+ succAux b _ = succ b ;
+
+ -- this is the transfer function
+ fun nat2bin : Nat -> Bin ;
+ def
+ nat2bin One = BOne ;
+ nat2bin (Succ n) = succ (nat2bin n) ;
+
+ -- and the other way round
+ fun bin2nat : Bin -> Nat ;
+ def
+ bin2nat BOne = One ;
+ bin2nat (BX b) = double (bin2nat b) ;
+ bin2nat (BXPlus b) = Succ (double (bin2nat b)) ;
+
+ fun double : Nat -> Nat ;
+ def
+ double One = Succ One ;
+ double (Succ n) = Succ (Succ (double n)) ;
+
+}