Advertisement
Guest User

Untitled

a guest
Nov 19th, 2019
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.03 KB | None | 0 0
  1. verify(InputFileName) :- see(InputFileName),
  2. read(Prems), read(Goal), read(Proof),
  3. seen,
  4. valid_proof(Prems, Goal, Proof).
  5.  
  6. valid_proof([H|T], G, [H2|T2]) :- findlast([H2|T2], _, [_|[G|_]]), check_rules([H|T], [H2|T2], [H2|T2], 1).
  7.  
  8. findlast([X], [], X).
  9. findlast([H | T], [H | N], X) :- findlast(T, N, X).
  10.  
  11. check_rules([_|_], [[]], _, _).
  12. check_rules([_|_], [], _, _).
  13. check_rules([H|T], [[_|[T1|_]]|T2], Proof, Count) :- get_rule(Proof, Count, [R|_]), (R == premise, get_prop(Proof, Count, Prop), check_premise(Prop, [H|T]) ;
  14. R == assumption, check_assumption(Proof, Count) ;
  15. R = copy(_), get_pred_of_prop(R, [_|[Num|_]]), copy(Num, Count, Proof) ;
  16. R = andint(_, _), get_pred_of_prop(R, [_|[A|[B|_]]]), andint(A, B, Count, Proof) ;
  17. R = andel1(_), get_pred_of_prop(R, [_|[Num|_]]), andel1(Num, Count, Proof) ;
  18. R = andel2(_), get_pred_of_prop(R, [_|[Num|_]]), andel2(Num, Count, Proof) ;
  19. R = orint1(_), get_pred_of_prop(R, [_|[Num|_]]), orint1(Num, Count, Proof) ;
  20. R = orint2(_), get_pred_of_prop(R, [_|[Num|_]]), orint2(Num, Count, Proof) ;
  21. R = impel(_, _), get_pred_of_prop(R, [_|[A|[B|_]]]), impel(A, B, Count, Proof) ;
  22. R = negint(_, _), get_pred_of_prop(R, [_|[A|[B|_]]]), negint(A, B, Count, Proof)),
  23. C1 is Count + 1,
  24. (not(is_list(T1)), check_rules([H|T], T2, Proof, C1) ; check_rules([H|T], [T1|T2], Proof, C1)).
  25.  
  26. check_assumption(Proof, Num) :- row_depth(Proof, Num, Depth), is_list(Depth), findlast(Depth, [_|_], 1).
  27.  
  28. check_premise(Result, H) :- Result == H.
  29. check_premise(Result, [H|T]) :- Result == H ; check_premise(Result, T).
  30.  
  31.  
  32. find_row([[[[H|T]|_]|_]|_], H, [H|T]).
  33. find_row([[[H|T]|_]|_], H, [H|T]).
  34. find_row([[H|T]|_], H, [H|T]).
  35. find_row([[[Hf|Tf]|T2]|[[H|T3]|T4]], Num, Result) :- less_than(H, Num), find_row([[H|T3]|T4], Num, Result) ; find_row([[Hf|Tf]|T2], Num, Result).
  36. find_row([[_|[T1|_]]|T2], Num, Result) :- (not(is_list(T1)), find_row(T2, Num, Result) ; find_row([T1|T2], Num, Result)).
  37.  
  38. less_than(H, Num) :- is_list(H), get_list_head(H, P), less_than(P, Num) ; not(is_list(H)), H =< Num.
  39. get_list_head([H|_], H).
  40.  
  41. depth(X, [X|_], [C], C).
  42. depth(X, [H|_], [C|D], C) :- depth(X, H, D, 1).
  43. depth(X, [_|T], D, C) :- C1 is C+1, depth(X, T, D, C1).
  44.  
  45. row_depth(Proof, Row, Depth) :- find_row(Proof, Row, FullRow), depth(FullRow, Proof, Depth, 1).
  46.  
  47. find_row_and_depth(Proof, Num, Row, Depth) :- find_row(Proof, Num, Row), row_depth(Row, Proof, Depth).
  48.  
  49. get_prop(Proof, Num, Prop) :- find_row(Proof, Num, [_|[Prop|_]]).
  50.  
  51. get_rule(Proof, Num, Rule) :- find_row(Proof, Num, [_|[_|Rule]]).
  52.  
  53. get_pred_of_prop(L, List) :- L =.. List.
  54.  
  55. lesser_depth([_], _).
  56. lesser_depth([Ha|Ta], [Hb|Tb]) :- Ha is Hb, lesser_depth(Ta, Tb).
  57.  
  58. valid_depth(Proof, RowA, RowB) :- row_depth(Proof, RowA, DepthA), row_depth(Proof, RowB, DepthB),
  59. lesser_depth(DepthA, DepthB).
  60. valid_depth_box(Proof, RowBox, RowB) :- depth(RowBox, Proof, DepthBox, 1), row_depth(Proof, RowB, DepthB),
  61. lesser_depth(DepthBox, DepthB).
  62.  
  63. check_box(Proof, Start, End, R) :- Start < End, row_depth(Proof, Start, [Hs|Ts]), row_depth(Proof, End, [Hs|Ts]), C1 is End+1, row_depth(Proof, C1, [H|T]), not(H is Hs), not(T is Ts), findlast(Ts, R, _).
  64.  
  65. copy(A, B, Proof) :-
  66. A < B,
  67. get_prop(Proof, A, PropA),
  68. get_prop(Proof, B, PropB),
  69. PropA==PropB, valid_depth(Proof, A, B).
  70.  
  71. andint(A, B, C, Proof) :-
  72. A < C,
  73. B < C,
  74. get_prop(Proof, A, PropA),
  75. get_prop(Proof, B, PropB),
  76. get_prop(Proof, C, PropC),
  77.  
  78. and(PropA, PropB) = PropC,
  79. valid_depth(Proof, A, C), valid_depth(Proof, B, C).
  80.  
  81. andel1(A, B, Proof) :-
  82. A < B,
  83.  
  84. get_rule(Proof, B, [Rule|_]),
  85. Rule = andel1(A),
  86.  
  87. get_prop(Proof, A, PropA),
  88. get_prop(Proof, B, PropB),
  89.  
  90. get_pred_of_prop(PropA, [_ | [PredLeftA | _]]),
  91.  
  92. PredLeftA = PropB,
  93. valid_depth(Proof, A, B).
  94.  
  95. andel2(A, B, Proof) :-
  96. A < B,
  97.  
  98. get_rule(Proof, B, [Rule|_]),
  99. Rule = andel2(A),
  100.  
  101. get_prop(Proof, A, PropA),
  102. get_prop(Proof, B, PropB),
  103.  
  104. get_pred_of_prop(PropA, [_ | [_ | [PredRightA | _]]]),
  105.  
  106. PredRightA = PropB,
  107. valid_depth(Proof, A, B).
  108.  
  109. orint1(A, B, Proof) :-
  110. A < B,
  111.  
  112. get_rule(Proof, B, [Rule|_]),
  113. Rule = orint1(A),
  114.  
  115. get_prop(Proof, A, PropA),
  116. get_prop(Proof, B, PropB),
  117.  
  118. get_pred_of_prop(PropB, [_ | [PredLeftB | _]]),
  119.  
  120. PredLeftB = PropA,
  121. valid_depth(Proof, A, B).
  122.  
  123. orint2(A, B, Proof) :-
  124. A < B,
  125.  
  126. get_rule(Proof, B, [Rule|_]),
  127. Rule = orint2(A),
  128.  
  129. get_prop(Proof, A, PropA),
  130. get_prop(Proof, B, PropB),
  131.  
  132. get_pred_of_prop(PropB, [_ | [_ | [PredRightB | _]]]),
  133.  
  134. PredRightB = PropA,
  135. valid_depth(Proof, A, B).
  136.  
  137. impel(A, B, C, Proof) :-
  138. A < C,
  139. B < C,
  140.  
  141. get_rule(Proof, C, [Rule|_]),
  142. Rule = impel(A, B),
  143.  
  144. get_prop(Proof, A, PropA),
  145. get_prop(Proof, B, PropB),
  146. get_prop(Proof, C, PropC),
  147.  
  148. ((get_pred_of_prop(PropB, [_ | [PredLeftB | [PredRightB | _]]]),
  149. PropA = PredLeftB,
  150. PropC = PredRightB) ;
  151. (get_pred_of_prop(PropA, [_ | [PredLeftA | [PredRightA | _]]]),
  152. PropB = PredLeftA,
  153. PropC = PredRightA)),
  154.  
  155. valid_depth(Proof, A, C), valid_depth(Proof, B, C).
  156.  
  157. negint(A, B, C, Proof) :-
  158. A < B,
  159. A < C,
  160. B < C,
  161.  
  162. check_box(Proof, A, B, Indexlist),
  163. valid_depth_box(Proof, Indexlist, C),
  164.  
  165. get_rule(C, Proof, Rule),
  166. Rule = negint(A, B),
  167.  
  168. get_prop(A, Proof, PropA),
  169. get_prop(B, Proof, PropB),
  170. get_prop(C, Proof, PropC),
  171.  
  172. get_pred_of_prop(PropC, PredC),
  173. get_pred_l(PredC, PredLeftC),
  174.  
  175. PropA = PredLeftC,
  176. PropB = cont.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement