Advertisement
Guest User

Untitled

a guest
Jun 11th, 2018
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Prolog 2.20 KB | None | 0 0
  1. %%%%%%%%%%%%
  2. % sat(F,I,M)
  3. % si F es satisfactible, M sera el model de F afegit a la interpretació I (a la primera crida I sera buida).
  4. % Assumim invariant que no hi ha literals repetits a les clausules ni la clausula buida inicialment.
  5. sat([],I,I):-     write('SAT!!'),nl,!.
  6. sat(CNF,I,M):-
  7.     % Ha de triar un literal d’una clausula unitaria, si no n’hi ha cap, llavors un literal pendent qualsevol.
  8.     decideix(CNF,Lit),
  9.  
  10.     % Simplifica la CNF amb el Lit triat (compte pq pot fallar, es a dir si troba la clausula buida fallara i fara backtraking).
  11.     simplif(Lit,CNF,CNFS),
  12.     \+ teLlistaBuida(CNFS),
  13.     append([Lit], I, X),
  14.    
  15.     % crida recursiva amb la CNF i la interpretacio actualitzada
  16.     sat(CNFS , X ,M).
  17.  
  18. %%%%%%%%%%%%%%%%%% 
  19. % decideix(F, Lit)
  20. % Donat una CNF,
  21. % -> el segon parametre sera un literal de CNF
  22. %  - si hi ha una clausula unitaria sera aquest literal, sino
  23. %  - un qualsevol o el seu negat.
  24. decideix(L1, Y):-agafarElement(L1,L2), esborraDuplicats([L2],A), member(Y, A).
  25.  
  26. %%%%%%%%%%%%%%%%%%%%%
  27. % agafarElement(L, N)  
  28. % Retorna un element de la llista de listes, prioritzant els que es troben sols a una llista  
  29. agafarElement(ListOfLists,Element):-
  30.     length(List,_),
  31.     member(List,ListOfLists),
  32.     member(Element,List), !.
  33.  
  34. %%%%%%%%%%%%%%%%%%%%%%%
  35. % esborraDuplicats(L1, L2) 
  36. % L2 és L1 sense els elements duplicats
  37. esborraDuplicats([], []).
  38. esborraDuplicats([H|T], [H|T1]) :-
  39.     esborraElementLlista(H, T, T2),
  40.     esborraDuplicats(T2, T1).
  41.  
  42. %%%%%%%%%%%%%%%%%%%%%
  43. % simlipf(Lit, F, FS)
  44. % Donat un literal Lit i una CNF,
  45. % -> el tercer parametre sera la CNF que ens han donat simplificada:
  46. %  - sense les clausules que tenen lit
  47. %  - treient -Lit de les clausules on hi es, si apareix la clausula buida fallara.
  48. simplif([], [], _):-!.
  49. simplif(_, [], []):-!.
  50. simplif(X, [Y|Ys], Z):-L is -X, member(L,Y), treu(L, Y, Y2), !, append([Y2], Ys, Y2s), simplif(X, Y2s, Z), !.
  51. simplif(X, [Y|Ys], Z):-member(X,Y), !, simplif(X, Ys, Z), !.
  52. simplif(X, [Y|Ys], Z):-!, simplif(X, Ys, Zs), append([Y], Zs, Z), !.
  53.    
  54. %%%%%%%%%%%%%%%%
  55. % treu(X,L1,L2)
  56. % L2 es L1 sense X.
  57. treu(_,[],[]).
  58. treu(X,[X|L1],L2):-treu(X,L1,L2).
  59. treu(X,[Y|L1],[Y|L2]):-treu(X,L1,L2).
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement