diff options
| author | aarne <unknown> | 2003-10-08 14:14:09 +0000 |
|---|---|---|
| committer | aarne <unknown> | 2003-10-08 14:14:09 +0000 |
| commit | ddd103ccd7422c35b5af0bcb5bad5edd49b080bb (patch) | |
| tree | aaec83676e940efff5c059d17b202756a8057572 /grammars/numerals/Nat.hs | |
| parent | a979508aa75a3f2b93072d214ca9c75ed874a39c (diff) | |
examples for transfer
Diffstat (limited to 'grammars/numerals/Nat.hs')
| -rw-r--r-- | grammars/numerals/Nat.hs | 46 |
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] |
