8 void subst(char *ident
, struct lambda
*t1
, struct lambda
*t2
, struct lambda
*total
)
13 if(strcmp(t1
->data
.identifier
, ident
) == 0){
15 free(t1
->data
.identifier
);
22 if(strcmp(t1
->data
.abstraction
.ident
, ident
) != 0)
23 subst(ident
, t1
->data
.abstraction
.expr
, t2
, total
);
26 subst(ident
, t1
->data
.application
.expr1
, t2
, total
);
27 subst(ident
, t1
->data
.application
.expr2
, t2
, total
);
32 void lambda_reduce(struct lambda
*t
, struct lambda
*total
, int *maxdepth
)
36 struct lambda
*t1
, *t2
;
41 lambda_reduce(t
->data
.abstraction
.expr
, total
, maxdepth
);
44 //If the first argument is an abstraction, we apply
45 t1
= t
->data
.application
.expr1
;
46 t2
= t
->data
.application
.expr2
;
47 if(t1
->which
== lambda_abs
){
48 subst(t1
->data
.abstraction
.ident
, t1
->data
.abstraction
.expr
, t2
, total
);
51 *total
= *t1
->data
.abstraction
.expr
;
52 *t
= *t1
->data
.abstraction
.expr
;
55 lambda_reduce(t
, total
, maxdepth
);