Here's a slightly modified version of the arity-inference algorithm, with
the distinction that we now have a kind "fn" with possible values "call"
and "arg", to make the interpretation of arrow types a bit clearer:
Everything else is as before.


expr(P, var(X), cons(def(X, T), nil), T).
expr(P, nat(X1), nil, nat) :-
    nat(X).
expr(P, bool(X), nil, bool) :-
    bool(X).
expr(P, pair(X, Y), C3, prod(A, B)) :-
    expr(pair, X, C1, A),
    expr(pair, Y, C2, B),
    append(C1, C2, C3).
expr(app, app(Fun, Arg), Cxt, B) :-
    expr(app, Fun, C1, arrow(fn(M), A, B)),
    expr(app, Arg, C2, A),
    append(C1, C2, Cxt).
expr(P, app(Fun, Arg), Cxt, B) :-
    dif(P, app),
    expr(app, Fun, C1, arrow(fn(call), A, B)),
    expr(app, Arg, C2, A),
    append(C1, C2, Cxt).
expr(P, lam(V1, lam(V2, Body)), Cxt, arrow(fn(arg), A, B)) :-
    expr(lam, lam(V2, Body), C1, B),
    split(V1, C1, Def, Cxt),
    unifyall(Def, A).
expr(P, lam(Var, Body), Cxt, arrow(fn(call), A, B)) :-
    dif(Body, lam(X, Y)),
    expr(lam, Body, C1, B),
    split(Var, C1, Def, Cxt),
    unifyall(Def, A).
expr(P, let(Var, Body, Rhs), Cxt, T2) :-
    expr(let, Body, C1, T1),
    expr(let, Rhs, C2, T2),
    split(Var, C2, Def, C3),
    unifyeach(Def, pair(C1, T1), C4),
    append(C3, C4, Cxt).


Keean.
_______________________________________________
bitc-dev mailing list
[email protected]
http://www.coyotos.org/mailman/listinfo/bitc-dev

Reply via email to