2024-04-09 11:30:52 +02:00
open Affichage
2024-04-16 10:07:09 +02:00
open Typing
2024-04-09 11:09:33 +02:00
2024-04-16 11:40:08 +02:00
type entry =
Simple of Lam . lam
2024-04-25 04:20:12 +02:00
| Reduce of Lam . lam
2024-04-16 11:40:08 +02:00
| AlphaEquiv of Lam . lam * Lam . lam
2024-04-25 04:20:12 +02:00
let beta_reduce e =
let rec aux = function
Some e ->
print_expr e ;
print_newline () ;
aux ( Lam . betastep e ) ;
| None -> ()
in print_expr e ;
print_newline () ;
let e = Lam . alpha_convert e in
print_expr e ;
print_newline () ;
aux ( Lam . betastep e )
let alpha_get_lam where_from =
let input_str = In_channel . input_all where_from in
match Str . split ( Str . regexp " & " ) input_str with
[ s1 ; s2 ] -> AlphaEquiv (
Parser . main Lexer . token ( Lexing . from_string ( s1 ^ " \n " ) ) ,
Parser . main Lexer . token ( Lexing . from_string s2 )
)
| _ -> failwith " Alpha-equivalence: nombre de delimiteurs incorrect "
2024-04-09 11:09:33 +02:00
let interpret e =
begin
2024-04-09 11:30:52 +02:00
print_expr e ;
2024-04-09 11:09:33 +02:00
print_newline () ;
2024-04-16 10:07:09 +02:00
print_ty ( typeinfer [] e ) ;
2024-04-09 11:09:33 +02:00
print_newline ()
end
2024-04-16 11:40:08 +02:00
let nom_fichier = ref " "
2024-04-25 04:20:12 +02:00
let reduce = ref false
2024-04-16 14:24:06 +02:00
let alpha = ref false
2024-04-25 04:20:12 +02:00
let equiv_fichier = ref " "
2024-04-16 11:40:08 +02:00
let parse_channel c =
let lexbuf = Lexing . from_channel c in
Parser . main Lexer . token lexbuf
let recupere_entree () =
let optlist = [
2024-04-25 04:20:12 +02:00
( " -alpha " ,
Arg . Set alpha ,
" Vérifie l'alpha équivalence de deux termes séparés par & " ) ;
( " -reduce " ,
Arg . Set reduce ,
" Affiche les réductions successives du lambda-terme " )
2024-04-16 11:40:08 +02:00
] in
let usage = " Bienvenue à bord. " in (* message d'accueil, option -help *)
Arg . parse (* ci-dessous les 3 arguments de Arg.parse : *)
optlist (* la liste des options definie plus haut *)
( fun s -> nom_fichier := s ) (* la fonction a declencher lorsqu'on recupere un string qui n'est pas une option : ici c'est le nom du fichier, et on stocke cette information dans la reference nom_fichier *)
usage ; (* le message d'accueil *)
2024-04-16 14:24:06 +02:00
try
2024-04-16 11:40:08 +02:00
let where_from = match ! nom_fichier with
| " " -> stdin
| s -> open_in s in
2024-04-25 04:20:12 +02:00
if ! alpha
then alpha_get_lam where_from
else if ! reduce
then Reduce ( parse_channel where_from )
2024-04-16 14:24:06 +02:00
else Simple ( parse_channel where_from )
2024-04-16 11:40:08 +02:00
with e -> ( Printf . printf " problème de saisie \n " ; raise e )
2024-04-09 11:09:33 +02:00
2024-04-16 11:40:08 +02:00
(* la fonction principale *)
let run () =
try
match recupere_entree () with
Simple l -> let _ = interpret l in ()
2024-04-25 04:20:12 +02:00
| Reduce l -> let _ = beta_reduce l in ()
2024-04-16 11:40:08 +02:00
| AlphaEquiv ( l1 , l2 ) -> begin
if ( ( Lam . ( = ~ ) ) l1 l2 ) then
print_string " true \n "
else
print_string " false \n "
end ;
flush stdout
with e -> raise e
2024-04-09 11:09:33 +02:00
2024-04-16 11:40:08 +02:00
let _ = run ()
2024-04-09 11:09:33 +02:00