Advertisement
Guest User

Untitled

a guest
Nov 20th, 2019
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.05 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(Prems, G, Proof) :- findlast(Proof, _, [_|[G|_]]), check_rules(Prems, Proof, Proof, 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(Prems, [[H|H1]|T2], Proof, Count) :- get_rule(Proof, Count, [R|_]), (R == premise, get_prop(Proof, Count, Prop), check_premise(Prop, Prems) ;
  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 = orel(_, _, _, _, _), get_pred_of_prop(R, [_|[X|[A|[B|[C|[D|_]]]]]]), orel(X, A, B, C, D, Count, Proof) ;
  22. R = impint(_, _), get_pred_of_prop(R, [_|[A|[B|_]]]), impint(A, B, Count, Proof) ;
  23. R = impel(_, _), get_pred_of_prop(R, [_|[A|[B|_]]]), impel(A, B, Count, Proof) ;
  24. R = negint(_, _), get_pred_of_prop(R, [_|[A|[B|_]]]), negint(A, B, Count, Proof) ;
  25. R = negel(_, _), get_pred_of_prop(R, [_|[A|[B|_]]]), negel(A, B, Count, Proof) ;
  26. R = contel(_), get_pred_of_prop(R, [_|[Num|_]]), contel(Num, Count, Proof) ;
  27. R = negnegint(_), get_pred_of_prop(R, [_|[Num|_]]), negnegint(Num, Count, Proof) ;
  28. R = negnegel(_), get_pred_of_prop(R, [_|[Num|_]]), negnegel(Num, Count, Proof) ;
  29. R = mt(_, _), get_pred_of_prop(R, [_|[A|[B|_]]]), mt(A, B, Count, Proof) ;
  30. R = pbc(_, _), get_pred_of_prop(R, [_|[A|[B|_]]]), pbc(A, B, Count, Proof) ;
  31. R == lem, lem(Count, Proof)), !,
  32. C1 is Count + 1,
  33. ((list_empty(H1) ; get_list_head(H1, H2), not(is_list(H2))), check_rules(Prems, T2, Proof, C1) ;
  34. nested_list(H), get_tail(H, T), check_rules(Prems, [[T|H1]|T2], Proof, C1) ;
  35. get_list_head(H1, H2), is_list(H2), check_rules(Prems, [H1|T2], Proof, C1)).
  36.  
  37. list_empty([]).
  38. nested_list(A) :- A = [[_]|_] ; A = [_|[_]].
  39. get_tail([_|T], T).
  40.  
  41. check_assumption(Proof, Num) :- row_depth(Proof, Num, Depth), is_list(Depth), findlast(Depth, [_|_], 1).
  42.  
  43. check_premise(Result, H) :- Result == H.
  44. check_premise(Result, [H|T]) :- Result == H ; check_premise(Result, T).
  45.  
  46.  
  47. find_row([[[[H|T]|_]|_]|_], H, [H|T]).
  48. find_row([[[H|T]|_]|_], H, [H|T]).
  49. find_row([[H|T]|_], H, [H|T]).
  50. 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).
  51. find_row([[_|[T1|_]]|T2], Num, Result) :- (not(is_list(T1)), find_row(T2, Num, Result) ; find_row([T1|T2], Num, Result)).
  52.  
  53. less_than(H, Num) :- is_list(H), get_list_head(H, P), less_than(P, Num) ; not(is_list(H)), H =< Num.
  54.  
  55. get_list_head([H|_], H).
  56.  
  57. depth(X, [X|_], [C], C).
  58. depth(X, [H|_], [C|D], C) :- depth(X, H, D, 1).
  59. depth(X, [_|T], D, C) :- C1 is C+1, depth(X, T, D, C1).
  60.  
  61. row_depth(Proof, Row, Depth) :- find_row(Proof, Row, FullRow), depth(FullRow, Proof, Depth, 1).
  62.  
  63. find_row_and_depth(Proof, Num, Row, Depth) :- find_row(Proof, Num, Row), row_depth(Row, Proof, Depth).
  64.  
  65. get_prop(Proof, Num, Prop) :- find_row(Proof, Num, [_|[Prop|_]]).
  66.  
  67. get_rule(Proof, Num, Rule) :- find_row(Proof, Num, [_|[_|Rule]]).
  68.  
  69. get_pred_of_prop(L, List) :- L =.. List.
  70.  
  71. lesser_depth([_], _).
  72. lesser_depth([Ha|Ta], [Hb|Tb]) :- Ha is Hb, lesser_depth(Ta, Tb).
  73.  
  74. valid_depth(Proof, RowA, RowB) :- row_depth(Proof, RowA, DepthA), row_depth(Proof, RowB, DepthB),
  75. lesser_depth(DepthA, DepthB).
  76. valid_depth_box(Proof, DepthBox, RowB) :- row_depth(Proof, RowB, DepthB),
  77. lesser_depth(DepthBox, DepthB).
  78.  
  79. check_box(Proof, Start, End, R) :- Start =< End, get_rule(Proof, Start, [Rule|_]), Rule == assumption, row_depth(Proof, Start, [Hs|Ts]), row_depth(Proof, End, [He|Te]), findlast([Hs|Ts], Rs, _), findlast([He|Te], Re, _), Rs = Re, C1 is End+1, row_depth(Proof, C1, [H|T]), findlast([H|T], Rc, _), not(Rc = Re), findlast([Hs|Ts], R, _).
  80.  
  81. copy(A, B, Proof) :-
  82. A < B,
  83. get_prop(Proof, A, PropA),
  84. get_prop(Proof, B, PropB),
  85. PropA==PropB, valid_depth(Proof, A, B).
  86.  
  87. andint(A, B, C, Proof) :-
  88. A < C,
  89. B < C,
  90. get_prop(Proof, A, PropA),
  91. get_prop(Proof, B, PropB),
  92. get_prop(Proof, C, PropC),
  93.  
  94. and(PropA, PropB) = PropC,
  95. valid_depth(Proof, A, C), valid_depth(Proof, B, C).
  96.  
  97. andel1(A, B, Proof) :-
  98. A < B,
  99.  
  100. get_prop(Proof, A, PropA),
  101. get_prop(Proof, B, PropB),
  102.  
  103. get_pred_of_prop(PropA, [_ | [PredLeftA | _]]),
  104.  
  105. PredLeftA = PropB,
  106. valid_depth(Proof, A, B).
  107.  
  108. andel2(A, B, Proof) :-
  109. A < B,
  110.  
  111. get_prop(Proof, A, PropA),
  112. get_prop(Proof, B, PropB),
  113.  
  114. get_pred_of_prop(PropA, [_ | [_ | [PredRightA | _]]]),
  115.  
  116. PredRightA = PropB,
  117. valid_depth(Proof, A, B).
  118.  
  119. orint1(A, B, Proof) :-
  120. A < B,
  121.  
  122. get_prop(Proof, A, PropA),
  123. get_prop(Proof, B, PropB),
  124.  
  125. get_pred_of_prop(PropB, [_ | [PredLeftB | _]]),
  126.  
  127. PredLeftB = PropA,
  128. valid_depth(Proof, A, B).
  129.  
  130. orint2(A, B, Proof) :-
  131. A < B,
  132.  
  133. get_prop(Proof, A, PropA),
  134. get_prop(Proof, B, PropB),
  135.  
  136. get_pred_of_prop(PropB, [_ | [_ | [PredRightB | _]]]),
  137.  
  138. PredRightB = PropA,
  139. valid_depth(Proof, A, B).
  140.  
  141. orel(X, A, B, C, D, E, Proof) :-
  142. A < B,
  143. C < D,
  144. B < E,
  145. D < E,
  146. X < E,
  147.  
  148. check_box(Proof, A, B, Il1),
  149. valid_depth_box(Proof, Il1, E),
  150.  
  151. check_box(Proof, C, D, Il2),
  152. valid_depth_box(Proof, Il2, E),
  153.  
  154. get_prop(Proof, A, PropA),
  155. get_prop(Proof, B, PropB),
  156. get_prop(Proof, C, PropC),
  157. get_prop(Proof, D, PropD),
  158. get_prop(Proof, X, PropX),
  159.  
  160. PropB = PropD,
  161. (PropX = or(PropA, PropC) ; PropX = or(PropC, PropA)).
  162.  
  163. impint(A, B, C, Proof) :-
  164. A =< B,
  165. B < C,
  166.  
  167. check_box(Proof, A, B, Indexlist),
  168. valid_depth_box(Proof, Indexlist, C),
  169.  
  170. get_prop(Proof, A, PropA),
  171. get_prop(Proof, B, PropB),
  172. get_prop(Proof, C, PropC),
  173.  
  174. get_pred_of_prop(PropC, [_ | [PredLeftC | [PredRightC | _]]]),
  175.  
  176. PropA = PredLeftC,
  177. PropB = PredRightC.
  178.  
  179. impel(A, B, C, Proof) :-
  180. A < C,
  181. B < C,
  182.  
  183. get_prop(Proof, A, PropA),
  184. get_prop(Proof, B, PropB),
  185. get_prop(Proof, C, PropC),
  186.  
  187. ((get_pred_of_prop(PropB, [_ | [PredLeftB | [PredRightB | _]]]),
  188. PropA = PredLeftB,
  189. PropC = PredRightB) ;
  190. (get_pred_of_prop(PropA, [_ | [PredLeftA | [PredRightA | _]]]),
  191. PropB = PredLeftA,
  192. PropC = PredRightA)),
  193.  
  194. valid_depth(Proof, A, C), valid_depth(Proof, B, C).
  195.  
  196. negint(A, B, C, Proof) :-
  197. A < B,
  198. A < C,
  199. B < C,
  200.  
  201. check_box(Proof, A, B, Indexlist),
  202. valid_depth_box(Proof, Indexlist, C),
  203.  
  204. get_prop(Proof, A, PropA),
  205. get_prop(Proof, B, PropB),
  206. get_prop(Proof, C, PropC),
  207.  
  208. get_pred_of_prop(PropC, [_ | [PredLeftC | _]]),
  209.  
  210. PropA = PredLeftC,
  211. PropB = cont.
  212.  
  213. negel(A, B, C, Proof) :-
  214. A < C,
  215. B < C,
  216.  
  217. get_prop(Proof, A, PropA),
  218. get_prop(Proof, B, PropB),
  219. get_prop(Proof, C, PropC),
  220.  
  221. ((PropB = neg(_), get_pred_of_prop(PropB, [_ | [PredLeftB | _]]),
  222. PropA = PredLeftB) ;
  223. (PropA = neg(_), get_pred_of_prop(PropA, [_ | [PredLeftA | _]]),
  224. PropB = PredLeftA)),
  225.  
  226. PropC = cont,
  227. valid_depth(Proof, A, C), valid_depth(Proof, B, C).
  228.  
  229. contel(A, B, Proof) :-
  230. A < B,
  231.  
  232. get_prop(Proof, A, PropA),
  233.  
  234. PropA = cont,
  235. valid_depth(Proof, A, B).
  236.  
  237. negnegint(A, B, Proof) :-
  238. A < B,
  239.  
  240. get_prop(Proof, A, PropA),
  241. get_prop(Proof, B, PropB),
  242.  
  243. get_pred_of_prop(PropB, [_|[PredLeftB|_]]),
  244. get_pred_of_prop(PredLeftB, [_|[PredLeftBB|_]]),
  245.  
  246. PropA = PredLeftBB,
  247. valid_depth(Proof, A, B).
  248.  
  249. negnegel(A, B, Proof) :-
  250. A < B,
  251.  
  252. get_prop(Proof, A, PropA),
  253. get_prop(Proof, B, PropB),
  254.  
  255. get_pred_of_prop(PropA, [_|[PredLeftA|_]]),
  256. get_pred_of_prop(PredLeftA, [_|[PredLeftAA|_]]),
  257.  
  258. PropB = PredLeftAA.
  259.  
  260. mt(A, B, C, Proof) :-
  261. A < C,
  262. B < C,
  263.  
  264. get_prop(Proof, A, PropA),
  265. get_prop(Proof, B, PropB),
  266. get_prop(Proof, C, PropC),
  267.  
  268. get_pred_of_prop(PropA, [_ | [PredLeftA | [PredRightA | _]]]),
  269.  
  270. neg(PredLeftA) = PropC,
  271. neg(PredRightA) = PropB,
  272. valid_depth(Proof, A, C), valid_depth(Proof, B, C).
  273.  
  274. pbc(A, B, C, Proof) :-
  275. A < B,
  276. B < C,
  277.  
  278. check_box(Proof, A, B, Indexlist),
  279. valid_depth_box(Proof, Indexlist, C),
  280.  
  281. get_prop(Proof, A, PropA),
  282. get_prop(Proof, B, PropB),
  283. get_prop(Proof, C, PropC),
  284.  
  285. (PropC = neg(PropA) ;
  286. get_pred_of_prop(PropA, [_ | [PredLeftA | _]]),
  287. PropC = PredLeftA),
  288. PropB == cont.
  289.  
  290. lem(A, Proof) :-
  291.  
  292. get_prop(Proof, A, PropA),
  293.  
  294. get_pred_of_prop(PropA, [_ | [PredLeftA | [PredRightA | _]]]),
  295.  
  296. (neg(PredLeftA) = PredRightA ; PredLeftA = neg(PredRightA)),
  297. (PropA = or(PredLeftA, PredRightA) ; PropA = or(PredRightA, PredLeftA)).
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement