summaryrefslogtreecommitdiff
path: root/grammars/numerals/Nat.hs
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.hs
parenta979508aa75a3f2b93072d214ca9c75ed874a39c (diff)
examples for transfer
Diffstat (limited to 'grammars/numerals/Nat.hs')
-rw-r--r--grammars/numerals/Nat.hs46
1 files changed, 46 insertions, 0 deletions
diff --git a/grammars/numerals/Nat.hs b/grammars/numerals/Nat.hs
new file mode 100644
index 000000000..73bc406ba
--- /dev/null
+++ b/grammars/numerals/Nat.hs
@@ -0,0 +1,46 @@
+module Nat where
+
+-- testing transfer from unary to binary, for Nat.gf. AR 8/10/2003
+
+data Nat = One | Succ Nat deriving Show
+
+data Bin = BOne | BX Bin | BXPlus Bin deriving Show
+
+succBin:: Bin -> Bin
+succBin BOne = BX BOne
+succBin (BX b) = BXPlus b
+succBin (BXPlus BOne) = BX (BX BOne)
+succBin b = succAux b (lastZero b)
+
+lastZero :: Bin -> Nat
+lastZero (BX _) = One
+lastZero (BXPlus b) = Succ (lastZero b)
+
+succAux :: Bin -> Nat -> Bin
+succAux (BXPlus b) One = BX (succBin b)
+succAux (BXPlus b) (Succ n) = BX (succAux b n)
+succAux b _ = succBin b
+
+int2bin :: Int -> Bin
+int2bin 1 = BOne
+int2bin n = succBin (int2bin (n-1))
+
+bin2nat :: Bin -> Nat
+bin2nat BOne = One
+bin2nat (BX b) = double (bin2nat b)
+bin2nat (BXPlus b) = Succ (double (bin2nat b))
+
+double :: Nat -> Nat
+double One = Succ One
+double (Succ n) = Succ (Succ (double n))
+
+
+-- to test
+
+prBin :: Bin -> String
+prBin BOne = "1"
+prBin (BX b) = prBin b ++ "0"
+prBin (BXPlus b) = prBin b ++ "1"
+
+test = map (prBin . int2bin) [1..16]
+test2 = map (bin2nat . int2bin) [1..16]