Slide 32
Slide 32 text
trait GCD[X <: Nat, Y <: Nat] { type Out <: Nat }
object GCD
def gcd[N<:Nat](x:Nat,y:Nat)(implicit gcd:Aux[x.N,y.N,N],wn:Witness.Aux[N]):N =
wn.value
type Aux[X <: Nat, Y <: Nat, Z <: Nat] = GCD[X, Y] { type Out = Z }
Scala
{
implicit def gcd0[X <: Nat]:
Aux[X, X, X] =
new GCD[X, X] { type Out = X }
implicit def gcd1[X <: Nat, Y <: Nat, Z <: Nat,
Out0 <: Nat]
(implicit ev0 : LT[X, Y],
ev1 : Diff.Aux[Y, X, Z],
ev2 : Aux[X, Z, Out0]):
Aux[X, Y, Out0] =
new GCD[X, Y] { type Out = Out0 }
implicit def gcd2[X <: Nat, Y <: Nat, Out0 <: Nat]
(implicit ev0 : LT[Y, X],
ev1 : Aux[Y, X, Out0]):
Aux[X, Y, Out0] =
new GCD[X, Y] { type Out = Out0}
}