| 9015 |      1 | (* type inference *)
 | 
|  |      2 | 
 | 
|  |      3 | Type = Func +
 | 
|  |      4 | 
 | 
|  |      5 | types ty
 | 
|  |      6 | 
 | 
|  |      7 | arities ty :: term
 | 
|  |      8 | 
 | 
|  |      9 | consts  bool	:: ty
 | 
|  |     10 | 	nat	:: ty
 | 
|  |     11 | 	"->"	:: ty => ty => ty	(infixr 20)
 | 
|  |     12 | 	typeof	:: [tm, ty] => bool
 | 
|  |     13 |         anyterm :: tm
 | 
|  |     14 | 
 | 
|  |     15 | rules	common_typeof	"
 | 
|  |     16 | typeof (app M N) B       :- typeof M (A -> B) & typeof N A..
 | 
|  |     17 | 
 | 
|  |     18 | typeof (cond C L R) A :- typeof C bool & typeof L A & typeof R A..
 | 
|  |     19 | typeof (fix F)   A       :- (!x. typeof x A => typeof (F  x) A)..
 | 
|  |     20 | 
 | 
|  |     21 | typeof true  bool..
 | 
|  |     22 | typeof false bool..
 | 
|  |     23 | typeof (M and N) bool :- typeof M bool & typeof N bool..
 | 
|  |     24 | 
 | 
|  |     25 | typeof (M eq  N) bool :- typeof M T    & typeof N T   ..
 | 
|  |     26 | 
 | 
|  |     27 | typeof  Z    nat..
 | 
|  |     28 | typeof (S N) nat :- typeof N nat..
 | 
|  |     29 | typeof (M + N) nat :- typeof M nat & typeof N nat..
 | 
|  |     30 | typeof (M - N) nat :- typeof M nat & typeof N nat..
 | 
|  |     31 | typeof (M * N) nat :- typeof M nat & typeof N nat"
 | 
|  |     32 | 
 | 
|  |     33 | rules	good_typeof	"
 | 
|  |     34 | typeof (abs Bo) (A -> B) :- (!x. typeof x A => typeof (Bo x) B)"
 | 
|  |     35 | 
 | 
|  |     36 | rules	bad1_typeof	"
 | 
|  |     37 | typeof (abs Bo) (A -> B) :- (typeof varterm A => typeof (Bo varterm) B)"
 | 
|  |     38 | 
 | 
|  |     39 | rules	bad2_typeof	"
 | 
|  |     40 | typeof (abs Bo) (A -> B) :- (typeof anyterm A => typeof (Bo anyterm) B)"
 | 
|  |     41 | 
 | 
|  |     42 | end
 |