Advertisement
Guest User

Untitled

a guest
Mar 26th, 2017
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.13 KB | None | 0 0
  1. % Definiujemy moduł zawierający rozwiązanie.
  2. % Należy zmienić nazwę modułu na {imie}_{nazwisko} gdzie za
  3. % {imie} i {nazwisko} należy podstawić odpowiednio swoje imię
  4. % i nazwisko bez znaków diakrytycznych
  5. :- module(pawel_szelag, [solve/2, op(200, fx, ~), op(500, xfy, v)]).
  6. % definiujemy operatory ~/1 oraz v/2
  7. :- op(200, fx, ~).
  8. :- op(500, xfy, v).
  9. % Główny predykat rozwiązujący zadanie.
  10. % UWAGA: to nie jest jeszcze rozwiązanie; należy zmienić jego
  11. % definicję.
  12.  
  13. solve(Clauses, Solution) :-
  14. create_list_of_clauses(Clauses,List),
  15. not(check_for_empty(List)),
  16. get_vars_from_list(List,Variables),
  17. get_perms(Variables,X),
  18. setof(X,check_list_of_clauses(List,X),[Solution]).
  19.  
  20.  
  21. %czy jest literałem
  22. lit(A) :- atom(A).
  23. lit(~A) :- atom(A).
  24.  
  25. %jesli jest zanegowaną zmienną zwraca tę zmienną
  26. is_neg(~A,A).
  27.  
  28. %sprawdza czy literał to zanegowana zmienna
  29. check_neg(~_).
  30.  
  31. %zwraca pierwszy element klauzuli
  32. get_first_el_of_clause(A,A) :- lit(A).
  33. get_first_el_of_clause(A v _, A) :- lit(A).
  34.  
  35. %zwraca klauzule bez pierwszego elementu
  36. get_rest_of_clause(A v B, B) :- lit(A).
  37. get_rest_of_clause(_, []).
  38.  
  39. %przekształca klauzulę na listę literałów (np. p v q v r -> [p,q,r])
  40. clause_to_list(Clause, List) :-
  41. clause_to_list(Clause, [], List).
  42.  
  43. clause_to_list([], List, List) :- !.
  44.  
  45. clause_to_list(H, T, Acc) :-
  46. get_first_el_of_clause(H,H1),
  47. get_rest_of_clause(H,T1),
  48. clause_to_list(T1, [H1|T], Acc),
  49. !.
  50.  
  51. %korzystając z poprzedniego predykatu przekształca wejście na listę list w powyższej postaci
  52. create_list_of_clauses([],[]).
  53. create_list_of_clauses([H|T], [H1|T1]) :-
  54. clause_to_list(H,H1),
  55. create_list_of_clauses(T,T1).
  56.  
  57. %sprawdza czy w liście klazul jest klazula pusta
  58. check_for_empty([[]]).
  59. check_for_empty([H|_]) :- H = [], !.
  60. check_for_empty([_|T]) :- check_for_empty(T), !.
  61.  
  62. %szuka wartosciowania konkretnej zmiennej wśród listy wartosciowań w postaci np. [(p,t),(q,f),(r,t)]
  63. look_for_val(X, [(A,V)|_], Res) :-
  64. lit(X),
  65. X = A,
  66. Res = V,
  67. !.
  68. look_for_val(X, [(_,_)|T], Res) :-
  69. look_for_val(X, T, Res).
  70.  
  71. %zwraca true jesli klauzula w postaci listy (np. [p,q,~r]) jest spełniona przy pomocy danych wartosciowań (Val_list)
  72. is_alt_true([],t).
  73.  
  74. is_alt_true([H|T], Val_list) :-
  75. not(check_neg(H)),
  76. look_for_val(H, Val_list, Res),
  77. Res = t;
  78. is_alt_true(T, Val_list),
  79. !.
  80. is_alt_true([H|T], Val_list) :-
  81. is_neg(H,A),
  82. look_for_val(A, Val_list, Res),
  83. Res = f;
  84. is_alt_true(T,Val_list),
  85. !.
  86.  
  87.  
  88. is_alt_true([_|T], Val_list) :-
  89. T \= [],
  90. is_alt_true(T, Val_list).
  91.  
  92. %używa is_alt_true na elementach listy klauzul
  93. check_list_of_clauses([],_).
  94. check_list_of_clauses([H|T], Val_list) :-
  95. is_alt_true(H, Val_list),
  96. check_list_of_clauses(T, Val_list).
  97.  
  98. %wyciąga z klauzuli zmienne (te zanegowane przekształca do postaci niezanegowanej), potrzebne to będzie przy sprawdzaniu jakie zmienne są w zbiorze klauzul. nie bierze pod uwagi pustych
  99.  
  100.  
  101. get_vars_from_clause([H|T],List) :-
  102. get_vars_from_clause([H|T],[],List).
  103.  
  104. get_vars_from_clause([],List,List).
  105.  
  106. get_vars_from_clause([H|T], T1, Acc) :-
  107. H = [],
  108. get_vars_from_clause(T, T1, Acc),
  109. !.
  110.  
  111. get_vars_from_clause([H|T], T1, Acc) :-
  112. not(check_neg(H)),
  113. not(member(H,T1)),
  114. get_vars_from_clause(T, [H|T1], Acc),
  115. !.
  116.  
  117. get_vars_from_clause([H|T], T1, Acc) :-
  118. check_neg(H),
  119. not(member(H,T1)),
  120. is_neg(H,H1),
  121. get_vars_from_clause(T, [H1|T1], Acc),
  122. !.
  123.  
  124. get_vars_from_clause([H|T], T1, Acc) :-
  125. check_neg(H),
  126. member(H,T1),
  127. get_vars_from_clause(T, T1, Acc),
  128. !.
  129.  
  130. get_vars_from_clause([H|T], T1, Acc) :-
  131. not(check_neg(H)),
  132. member(H,T1),
  133. get_vars_from_clause(T, T1, Acc),
  134. !.
  135.  
  136. %tworzy listę zmiennych użytych w zbiorze klauzul
  137. get_vars_from_list([],[]).
  138. get_vars_from_list([H|T],List) :-
  139. get_vars_from_clause(H, List1),
  140. get_vars_from_list(T, List2), append(List2,List1,List3), setof(X,member(X,List3),List).
  141.  
  142. %zwraca permutacje wartosciowań dla danej listy zmiennych (np. dla [p,q,r] kolejno [(p,t),(q,t),(r,t)],[(p,t),(q,t),(r,f)]) itd.
  143. get_perms([],[]).
  144. get_perms([H|T], [H1|T1]) :- (H1 = (H,t); H1 = (H,f)), get_perms(T,T1).
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement