Advertisement
Guest User

Untitled

a guest
Apr 14th, 2022
46
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OCaml 4.16 KB | None | 0 0
  1. open Ast
  2.  
  3. let pasbesoin = ref false
  4.  
  5. let est_de_valeur_1 = ref []
  6.  
  7. let est_de_valeur_0 = ref []
  8.  
  9. module type CHOICE = sig
  10.   val choice : Ast.Cnf.t -> Ast.var
  11. end
  12.  
  13. module DefaultChoice = struct
  14.   let choice : Ast.Cnf.t -> Ast.var = fun cnf -> failwith "todo: choice"
  15. end
  16.  
  17. module type SOLVER = sig
  18.   val solve : Ast.t -> Ast.model option
  19. end
  20.  
  21. let est_elle_vide c =
  22.   if Ast.Clause.is_empty c then (
  23.     print_endline "clause vide !";
  24.     pasbesoin := true)
  25.  
  26. let est_un_singleton c =
  27.   let x = Ast.Clause.choose c in
  28.   let d = Ast.Clause.remove x c in
  29.   Ast.Clause.is_empty c
  30.  
  31. (*si on rencontre une clause qui est un singleton, on la dégage et on ajoute son singleton*)
  32.  
  33. let rec print_liste l =
  34.   match l with
  35.   | [] -> ()
  36.   | y :: q ->
  37.       print_int y;
  38.       print_liste q
  39.  
  40. let satisfaire_clauses_singletons c p =
  41.   if est_un_singleton c then
  42.     let x = Ast.Clause.choose c in
  43.     if x > 0 then est_de_valeur_1 := x :: !est_de_valeur_1
  44.     else est_de_valeur_0 := x :: !est_de_valeur_0
  45.  
  46. (*
  47. let emonder_en_cascade l  p =
  48.    if Ast.Cnf.is_empty p
  49.     then (p, Some !est_de_valeur_1)
  50.     else ((let f y = satisfaire_clauses_singletons y !p0 in Ast.Cnf.iter (f) !p0 ; print_string "les litteraux en singletons positifs sont : " ;  print_liste !est_de_valeur_1  ; print_endline "" ; print_string "les litteraux en singletons negatifs sont : " ;  print_liste !est_de_valeur_0  ; print_endline "" ;  (*on recupère les singletons*)
  51.     let rec aux l = match l with
  52.         |[] -> !p0
  53.         |y :: q -> print_int y ; print_endline " a été retiré" ; let retirer_certaines_clauses c = if Ast.Clause.mem y c
  54.           then (p0 := Ast.Cnf.remove c !p0)
  55.           else (if Ast.Clause.mem (-y) c
  56.                 then (let f z = if Ast.Clause.equal z c then (Ast.Clause.remove (-y) c) else (z) in p0 := Ast.Cnf.map (f) !p0)
  57.                 else ())
  58.           in Ast.Cnf.iter (retirer_certaines_clauses) !p0 ;
  59.         in p0 := aux (!est_de_valeur_1 @ !est_de_valeur_0) ; if Ast.Cnf.is_empty !p0 then (Some !est_de_valeur_1) else ( Ast.Cnf.iter (est_elle_vide) !p0 ; if !pasbesoin then (print_endline "test du None" ; None) else (None))))
  60. *)
  61.  
  62. let fonction_DPLL : Ast.t -> Ast.model option =
  63.  fun p ->
  64.   let modele = ref [] in
  65.   let p0 = ref p.cnf in
  66.   pasbesoin := false;
  67.   Ast.Cnf.iter est_elle_vide !p0;
  68.   if !pasbesoin then None (*il ya une clause vide, donc c'est unsat *)
  69.   else if Ast.Cnf.is_empty !p0 then Some !modele
  70.     (*si il n'y a plus de clauses alors c'est vrai*)
  71.   else
  72.     let f y = satisfaire_clauses_singletons y !p0 in
  73.     Ast.Cnf.iter f !p0;
  74.     print_string "les litteraux en singletons positifs sont : ";
  75.     print_liste !est_de_valeur_1;
  76.     print_endline "";
  77.     print_string "les litteraux en singletons negatifs sont : ";
  78.     print_liste !est_de_valeur_0;
  79.     print_endline "";
  80.     (*on recupère les singletons*)
  81.     let rec aux l =
  82.       match l with
  83.       | [] -> !p0
  84.       | y :: q ->
  85.           print_int y;
  86.           let flag = ref false in
  87.           print_endline " a été retiré";
  88.           let retirer_certaines_clauses c =
  89.             (*définition d'une fonction qu'on va appliquer à p0*)
  90.             if Ast.Clause.mem y c then p0 := Ast.Cnf.remove c !p0
  91.             else if Ast.Clause.mem (-y) c (*ici y n'est pas membre de c*) then
  92.               let f z =
  93.                 if Ast.Clause.equal z c then
  94.                   let d = Ast.Clause.remove (-y) c in
  95.                   if est_un_singleton d then (
  96.                     let x0 = Ast.Clause.choose d in
  97.                     Ast.Cnf.remove c !p0;
  98.                     flag := true)
  99.                   else d
  100.                 else z
  101.               in
  102.               p0 := Ast.Cnf.map f !p0
  103.           in
  104.           Ast.Cnf.iter retirer_certaines_clauses !p0;
  105.           if !flag then aux (x0 :: q) else aux q
  106.     in
  107.     p0 := aux (!est_de_valeur_1 @ !est_de_valeur_0);
  108.     if Ast.Cnf.is_empty !p0 then Some !est_de_valeur_1
  109.     else (
  110.       Ast.Cnf.iter est_elle_vide !p0;
  111.       if !pasbesoin then (
  112.         print_endline "test du None";
  113.         None)
  114.       else None)
  115.  
  116. module DPLL (C : CHOICE) : SOLVER = struct
  117.   let solve : Ast.t -> Ast.model option = fonction_DPLL
  118. end
  119.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement