1 changed files with 112 additions and 0 deletions
			
			
		| @ -0,0 +1,112 @@ | |||||||
|  | type term =  | ||||||
|  |   | Var of string | ||||||
|  |   | Lambda of string * term | ||||||
|  |   | App of term * term | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | let rec apply x sub = function | ||||||
|  |   | Var (y) -> if y = x then sub else Var (y) | ||||||
|  |   | Lambda (y,t) -> Lambda (y, apply x sub t) | ||||||
|  |   | App (t1, t2) -> App (apply x sub t1, apply x sub t2) | ||||||
|  |      | ||||||
|  | let rec subst t sub_list = | ||||||
|  |   List.fold_left (fun t (x, sub) -> apply x sub t) t sub_list | ||||||
|  |    | ||||||
|  | let rec beta = function | ||||||
|  |   | App (Lambda (x, t), u) -> subst t [(x, u)] | ||||||
|  |   | _ -> failwith  "This term is not a redex" | ||||||
|  | 
 | ||||||
|  | (* --------------------------------------- | ||||||
|  |    Exemples | ||||||
|  |    --------------------------------------- *) | ||||||
|  | 
 | ||||||
|  | let x = Var "x";; | ||||||
|  | let y = Var "y";; | ||||||
|  | let a = Var "a" ;; | ||||||
|  | let b = Var "b" ;; | ||||||
|  | let i = Lambda ("x", x);; | ||||||
|  | 
 | ||||||
|  | (*(λx. x x) a — duplication*) | ||||||
|  | let n1 = App (Lambda ("x", App (x, x)), a);; | ||||||
|  | (*(λx. x x) (λa. a) — passage de fonction / ordre supérieur*) | ||||||
|  | let n2 = App (Lambda ("x", App (x, x)), Lambda (("a"), a));; | ||||||
|  | (*(λx. x (λx.x)) y — variable libres/liées*) | ||||||
|  | let n3 = App (Lambda ("x", App (x, Lambda ("x", x) ) ), y) ;; | ||||||
|  | (*(λx. x (λy. x y)) y — capture de variable*) | ||||||
|  | let n4 = App (Lambda ("x", App(x, Lambda ("y", App (x, y)))), y);; | ||||||
|  | (*(λxy. x) a b — fonction à deux entrées et effacement*) | ||||||
|  | let n5 = App ( App ( Lambda ("x", ( Lambda ("y", x))), a), b);; | ||||||
|  | (*(λxy. x) a — application partielle pour deux entrées*) | ||||||
|  | let n6 = App ( Lambda ("x", ( Lambda ("y", x))), a);; | ||||||
|  | (*(λxy. x) I a b — sur application pour deux entrées*) | ||||||
|  | let n7 = App (App ( App (Lambda ("x", ( Lambda ("y", x))), i), a), b);; | ||||||
|  | (*(λx. x x) (I I) — duplication inutile dans une stratégie*) | ||||||
|  | let n8 = App ( Lambda ("x", App (x, x)), App ( i, i));; | ||||||
|  | (*(λxy. y) (I I) I — différence de complexité selon la stratégie*) | ||||||
|  | let n9 = App ( App (Lambda ("x", ( Lambda ("y", y))), App (i, i)), i);; | ||||||
|  | 
 | ||||||
|  | (* --------------------------------------- | ||||||
|  |    Display | ||||||
|  |    --------------------------------------- *) | ||||||
|  | 
 | ||||||
|  | let rec string_of_list printer sep = function | ||||||
|  |   | [] -> "" | ||||||
|  |   | [x] -> printer x | ||||||
|  |   | h::t -> | ||||||
|  |       (printer h) ^ sep ^ (string_of_list printer sep t) | ||||||
|  |   | ||||||
|  | 
 | ||||||
|  | let rec string_of_term = function | ||||||
|  |   | Var x -> x | ||||||
|  |   | Lambda (x, Lambda (y, t)) -> "λ" ^ x ^ y ^ ". " ^ string_of_term t ^ "" | ||||||
|  |   | Lambda (x, t) -> "λ" ^ x ^ ". " ^ string_of_term t ^ "" | ||||||
|  |   | App (Var x, Var y) -> x ^ " " ^ y | ||||||
|  |   | App (t, Var x) -> "(" ^ string_of_term t ^ ") " ^ x | ||||||
|  |   | App ( App  ( t, u), v) -> "(" ^ string_of_term (App (t, u)) ^ ") " ^ string_of_term v  | ||||||
|  |   | App ( u, App  ( t, v)) -> string_of_term u ^ " (" ^ string_of_term (App (t, v)) ^ ")" | ||||||
|  |   | App ( Lambda (x, App (t, y)), v) -> "(" ^ string_of_term (Lambda (x, App (t, y))) ^ ") " ^ string_of_term v | ||||||
|  |   | App ( Lambda (x, t), u) -> string_of_term (Lambda (x,t)) ^ " (" ^ string_of_term u ^")"  | ||||||
|  |   | App (t, u) -> string_of_term t ^ " (" ^ string_of_term u ^ ")" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | (* --------------------------------------- | ||||||
|  |   Réduction | ||||||
|  |   --------------------------------------- *) | ||||||
|  | 
 | ||||||
|  | exception Irreductible | ||||||
|  | 
 | ||||||
|  | let is_value = function | ||||||
|  |   | Lambda (_, _) -> true | ||||||
|  |   | Var _ -> true | ||||||
|  |   | _ -> false  | ||||||
|  | 
 | ||||||
|  | let rec lo_reduction = function  | ||||||
|  |   | App ( Lambda (x, t), u) as redex -> (beta redex) | ||||||
|  |   | App (Var x, (_ as t)) -> App (Var x, lo_reduction t) | ||||||
|  |   | App (App (_,_) as t, Var x) -> App (lo_reduction t, Var x) | ||||||
|  |   | App (t, u) -> (App (lo_reduction t, lo_reduction u)) | ||||||
|  |   | Lambda (x, t) -> Lambda (x, lo_reduction t) | ||||||
|  |   | _ -> raise Irreductible | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | let rec lo_eval t =  | ||||||
|  |   try let t' = lo_reduction t in | ||||||
|  |     lo_eval t' with Irreductible -> t  | ||||||
|  |        | ||||||
|  | 
 | ||||||
|  | let (*cbv*) cbv = function | ||||||
|  |   | App ( Lambda (x, t), v) as redex when is_value v -> (*cbv*) (beta redex) | ||||||
|  |   | App (t, u) -> (App (t, (*cbv*) u)) | ||||||
|  |   | Lambda (x, t) as l -> l  | ||||||
|  |   | Var x -> Var x | ||||||
|  | 
 | ||||||
|  | let rec cbv_loop t =  | ||||||
|  |   let t' = cbv t in  | ||||||
|  |   if t' = t then t' | ||||||
|  |   else cbv_loop t' | ||||||
|  | 
 | ||||||
|  | let rec cbn = function | ||||||
|  |   | App ( Lambda (x, t), v) as redex -> cbn (beta redex) | ||||||
|  |   | App (t, u) -> cbn (App (cbn t, u)) | ||||||
|  |   | Lambda (x, t) -> Lambda (x, t) | ||||||
|  |   | Var x -> Var x | ||||||
					Loading…
					
					
				
		Reference in new issue