6 struct type
*scheme_instantiate(struct gamma
*gamma
, struct scheme
*sch
)
8 struct subst
*s
= subst_id();
9 for (int i
= 0; i
<sch
->nvar
; i
++) {
10 s
= subst_union(s
, subst_singleton(sch
->var
[i
], gamma_fresh(gamma
)));
12 struct type
*t
= subst_apply_t(s
, type_dup(sch
->type
));
13 for (int i
= 0; i
<s
->nvar
; i
++)
19 struct scheme
*scheme_create(struct type
*t
)
21 struct scheme
*s
= safe_malloc(sizeof(struct scheme
));
27 struct scheme
*scheme_generalise(struct gamma
*gamma
, struct type
*t
)
29 struct scheme
*s
= safe_malloc(sizeof(struct scheme
));
32 type_ftv(t
, &nftv
, &ftv
);
36 s
->var
= safe_malloc(nftv
*sizeof(char *));
37 for (int i
= 0; i
<nftv
; i
++) {
39 for (int j
= 0; j
<gamma
->nschemes
; j
++)
40 if (strcmp(gamma
->vars
[j
], ftv
[i
]) == 0)
50 void scheme_print(struct scheme
*scheme
, FILE *out
)
52 if (scheme
->nvar
> 0) {
54 for (int i
= 0; i
<scheme
->nvar
; i
++)
55 fprintf(out
, "%s", scheme
->var
[i
]);
58 type_print(scheme
->type
, out
);
61 void scheme_free(struct scheme
*scheme
)
63 type_free(scheme
->type
);
64 for (int i
= 0; i
<scheme
->nvar
; i
++)