Merge branch 'working'
[lambda.git] / code / ski_evaluator.ml
index 4d6f9a1..f0b4d16 100644 (file)
@@ -1,30 +1,32 @@
-type term = I | S | K | App of (term * term)                    
-                                                               
-let skomega = App (App (App (S,I), I), App (App (S,I), I))                
+type term = I | S | K | App of (term * term)
+
+let skomega = App (App (App (S,I), I), App (App (S,I), I))
 let test = App (App (K,I), skomega)
-                                                                      
-let reduce_one_step (t:term):term = match t with                    
-    App(I,a) -> a                                                    
-  | App(App(K,a),b) -> a                                             
-  | App(App(App(S,a),b),c) -> App(App(a,c),App(b,c))                       
-  | _ -> t                                                     
-                                                               
-let is_redex (t:term):bool = not (t = reduce_one_step t)        
-                                                                      
-let rec reduce (t:term):term = match t with                        
-    I -> I                                                     
-  | K -> K                                                     
-  | S -> S                                                     
-  | App (a, b) ->                                                   
-      let t' = App (reduce a, reduce b) in                      
-        if (is_redex t') then reduce (reduce_one_step t')     
-                         else t'                               
 
-let rec reduce_lazy (t:term):term = match t with                        
-    I -> I                                                     
-  | K -> K                                                     
-  | S -> S                                                     
-  | App (a, b) ->                                                   
-      let t' = App (reduce_lazy a, b) in                      
-        if (is_redex t') then reduce_lazy (reduce_one_step t')     
-                         else t'                               
+let reduce_if_redex (t:term):term = match t with
+  | App(I,a) -> a
+  | App(App(K,a),b) -> a
+  | App(App(App(S,a),b),c) -> App(App(a,c),App(b,c))
+  | _ -> t
+
+let is_redex (t:term):bool = not (t = reduce_if_redex t)
+
+let rec reduce_try2 (t:term):term = match t with
+  | I -> I
+  | K -> K
+  | S -> S
+  | App (a, b) ->
+      let t' = App (reduce_try2 a, reduce_try2 b) in
+      if (is_redex t') then let t'' = reduce_if_redex t'
+                            in reduce_try2 t''
+                       else t'
+
+let rec reduce_lazy (t:term):term = match t with
+  | I -> I
+  | K -> K
+  | S -> S
+  | App (a, b) ->
+      let t' = App (reduce_lazy a, b) in
+      if (is_redex t') then let t'' = reduce_if_redex t'
+                            in reduce_lazy t''
+                       else t'