J'essaye de faire un TP sur les calculs de conditions de vérification. Seulement je bute sur l'une de mes procédures.
Donc, j'ai 2 fonctions formule2string et expr2string qui prennent respectivement une formule et une expression et qui rend l'expression sous forme de chaine.
Moi, je dois coder programme2string, qui prend donc un programme et renvoi un string.
Voici ma fonction qui pose prob, il s'agit du filtre Bloc, j'ai du mal à le gérer.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 type variable = string type operateur = Plus | Moins | Mult | Inf | Sup | Infeg | Supeg | Egal type expression= Const of int | Var of variable | BinExpr of operateur * expression * expression type formule= Expr of expression | Et of formule * formule | Ou of formule * formule | Non of formule | Implique of formule * formule | True | False | Qqsoit of (variable list) * formule type programme= Affectation of variable * expression | If of formule * programme * programme | While of formule * programme * formule | Bloc of programme list | Skip type progAnnote= formule * programme * formule let exempleProg= Bloc([Affectation("x",BinExpr(Plus,Var("x"),Const(1))); While(Expr(BinExpr(Supeg,Var("x"),Const(0))), If(Expr(BinExpr(Egal,Var("x"),Const(0))), Affectation("x",BinExpr(Plus,Var("x"),Const(1))), Affectation("x",BinExpr(Moins,Var("x"),Const(2)))),True)]);;
J'ai également essayé
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 let rec programme2string (p: programme) = match p with Affectation(v,e) -> (v)^" := "^(expr2string e) | If(f,p1,p2) -> "if "^(formule2string f)^" then "^(programme2string p1)^" else "^(programme2string p2)^" endif" | While(f1,p,f2) -> "while "^(formule2string f1)^" do "^(formule2string f2)^(programme2string p)^" done" | Bloc(b::l) -> "begin "^(programme2string b)^(programme2string (Bloc(l)))^" end" | Skip -> " skip ";;
Voici ma fonction qui pose prob
Bon je suis plus trop sûr du 2eme code. Enfin le 2eme marche, mais mal, en fait je devrais avoir "begin end" qui entoure le bloc, hors là ça entoure chaque élement de la liste de Bloc, pourtant je met "begin end" entre le match.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 let rec programme2string (p: programme) = match p with Affectation(v,e) -> (v)^" := "^(expr2string e) | If(f,p1,p2) -> "if "^(formule2string f)^" then "^(programme2string p1)^" else "^(programme2string p2)^" endif" | While(f1,p,f2) -> "while "^(formule2string f1)^" do "^(formule2string f2)^(programme2string p)^" done" | Bloc(b::l) -> "begin "^(begin match b with [] -> "" | _ -> (programme2string b)^(programme2string (Bloc(l)) end)^" end" | Skip -> " skip ";;
Partager