first commit
This commit is contained in:
commit
6a52aa8da8
51
README.md
Normal file
51
README.md
Normal file
@ -0,0 +1,51 @@
|
||||
# Collatz Conjecture
|
||||
|
||||
Collatz Conjecture (Snowflake / `3n+1`) done in the GHC Type System.
|
||||
|
||||
## Running
|
||||
|
||||
in `ghci` load the file:
|
||||
|
||||
```
|
||||
:load collatz.hs
|
||||
```
|
||||
|
||||
and run with the following:
|
||||
|
||||
```
|
||||
:t solution (nil :: X)
|
||||
```
|
||||
|
||||
where `X` is the church encoding using `S n` and `Z`, ie
|
||||
|
||||
`(S (S (S Z)))` is the number `3`
|
||||
|
||||
## Example
|
||||
|
||||
```
|
||||
*Main> :t solution (nil :: (S (S (S Z))))
|
||||
solution (nil :: (S (S (S Z))))
|
||||
:: Cons
|
||||
(S (S (S Z)))
|
||||
(Cons
|
||||
(S (S (S (S (S (S (S (S (S (S Z))))))))))
|
||||
(Cons
|
||||
(S (S (S (S (S Z)))))
|
||||
(Cons
|
||||
(S (S (S (S (S (S (S (S (S (S (S (S (S (S (S (S Z))))))))))))))))
|
||||
(Cons
|
||||
(S (S (S (S (S (S (S (S Z))))))))
|
||||
(Cons
|
||||
(S (S (S (S Z))))
|
||||
(Cons
|
||||
(S (S Z))
|
||||
(Cons
|
||||
(S Z)
|
||||
Nil)))))))
|
||||
```
|
||||
|
||||
which translates to the following list:
|
||||
|
||||
```
|
||||
[ 3 10 5 16 8 4 2 1 ]
|
||||
```
|
97
collatz.hs
Normal file
97
collatz.hs
Normal file
@ -0,0 +1,97 @@
|
||||
{-# OPTIONS_GHC -fno-warn-missing-methods #-}
|
||||
{-# LANGUAGE MultiParamTypeClasses #-}
|
||||
{-# LANGUAGE FunctionalDependencies #-}
|
||||
{-# LANGUAGE FlexibleInstances #-}
|
||||
{-# LANGUAGE UndecidableInstances #-}
|
||||
|
||||
nil = undefined
|
||||
|
||||
data True
|
||||
data False
|
||||
|
||||
data S n
|
||||
data Z
|
||||
|
||||
data Nil
|
||||
data Cons h t
|
||||
|
||||
class Not t b | t -> b
|
||||
instance Not True False
|
||||
instance Not False True
|
||||
|
||||
class And a b r | a b -> r
|
||||
instance And True True True
|
||||
instance And True False False
|
||||
instance And False True False
|
||||
instance And False False False
|
||||
|
||||
class Equal a b t | a b -> t
|
||||
instance Equal Z Z True
|
||||
instance Equal (S a) Z False
|
||||
instance Equal Z (S b) False
|
||||
instance (Equal a b t)
|
||||
=> Equal (S a) (S b) t
|
||||
|
||||
class Add x y r | x y -> r
|
||||
instance Add x Z x
|
||||
instance (Add (S x) n r)
|
||||
=> Add x (S n) r
|
||||
|
||||
class Mul x y a r | x y a -> r
|
||||
instance Mul x Z a a
|
||||
instance Mul Z y a a
|
||||
instance (Add x a n, Mul x y n t)
|
||||
=> Mul x (S y) a t
|
||||
|
||||
class Half x a r | x a -> r
|
||||
instance Half Z a a
|
||||
instance Half (S Z) a a
|
||||
instance (Half n (S a) r)
|
||||
=> Half (S (S n)) a r
|
||||
|
||||
class ThreeEnPlusOne x v | x -> v
|
||||
instance (Mul (S (S (S Z))) x Z i)
|
||||
=> ThreeEnPlusOne x (S i)
|
||||
|
||||
class If c t f r | c t f -> r
|
||||
instance If True t f t
|
||||
instance If False t f f
|
||||
|
||||
class EqOne x r | x -> r
|
||||
instance (Equal x (S Z) b)
|
||||
=> EqOne x b
|
||||
|
||||
class IsEven a b | a -> b
|
||||
instance IsEven Z True
|
||||
instance IsEven (S Z) False
|
||||
instance (IsEven n r)
|
||||
=> IsEven (S (S n)) r
|
||||
|
||||
class IsOdd a b | a -> b
|
||||
instance (IsEven a i, Not i r)
|
||||
=> IsOdd a r
|
||||
|
||||
class Branch b h n | b h -> n
|
||||
instance (Half h Z r)
|
||||
=> Branch True h r
|
||||
instance (ThreeEnPlusOne h r)
|
||||
=> Branch False h r
|
||||
|
||||
class RunChain b h t r | b h t -> r
|
||||
instance RunChain True h xs xs
|
||||
instance ( IsEven h e
|
||||
, EqOne h b
|
||||
, Branch e h v
|
||||
, RunChain b v (Cons h t) r
|
||||
)
|
||||
=> RunChain False h t r
|
||||
|
||||
class Reverse i l r | i l -> r
|
||||
instance Reverse i Nil i
|
||||
instance (Reverse (Cons x i) xs r)
|
||||
=> Reverse i (Cons x xs) r
|
||||
|
||||
class Solution n r | n -> r
|
||||
where solution :: n -> r
|
||||
instance (RunChain False n Nil o, Reverse Nil o a)
|
||||
=> Solution n a where solution = nil
|
Loading…
Reference in New Issue
Block a user