Guest User

Untitled

a guest
Apr 14th, 2022
73
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