descript-lang-0.2.0.0: test-resources/examples/Types.New+.dscr
//'Types.New' with property key syntax sugar.
//Uses ambiguous matches - might change in future.
//Separates values into 'Value[a] | Type[a]'.
Res[rec, prim].
//The type system
Value[a]. //An untyped value.
Type[a]. //A value's type.
//Values
Zero[].
Succ[prev].
Add[a, b].
Fib[a].
Fib3[a].
//Types
Nat[].
//Type signatures
Add[Type[Nat[]], Type[Nat[]]]: Type[Nat[]]
Fib[Type[Nat[]]]: Type[Nat[]]
Fib3[Type[Nat[]]]: Type[Nat[]]
//Untyped functions
Add[Value[Zero[]], Value[a]]: Value[b>a]
Add[Value[Succ[prev]], Value[a]]: Add[
Value[a>a>prev]
Value[Succ[prev: b<Add>a<Value]]
]
Fib[Value[Zero[]]]: Value[Succ[Zero[]]]
Fib[Value[Succ[Zero[]]]]: Value[Succ[Zero[]]]
Fib[Value[Succ[Succ[prev]]]]: Add[
Fib[Value[a>a>prev]]
Fib[Value[a>a>prev>prev]]
]
Fib3[Value[a]]: Fib[Fib[Fib[Value[a>a]]]]
//Alternate number representation
Add[Value[#Number[]], Value[#Number[]]]: Value[#Add[a>a, b>a]]
Fib[Value[0]]: Value[1]
Fib[Value[1]]: Value[1]
Fib[Value[#Number[]]]: Add[
Fib[Value[#Add[a>a, -1]]]
Fib[Value[#Add[a>a, -2]]]
]
//Query
Res[
rec: Fib3[Type[Nat[]] | Value[Succ[Succ[Succ[Succ[Zero[]]]]]]]
prim: Fib3[Type[Nat[]] | Value[4]]
]?