You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

572 lines
14 KiB

  1. /***** ltl2ba : parse.c *****/
  2. /* Written by Denis Oddoux, LIAFA, France */
  3. /* Copyright (c) 2001 Denis Oddoux */
  4. /* Modified by Paul Gastin, LSV, France */
  5. /* Copyright (c) 2007 Paul Gastin */
  6. /* */
  7. /* This program is free software; you can redistribute it and/or modify */
  8. /* it under the terms of the GNU General Public License as published by */
  9. /* the Free Software Foundation; either version 2 of the License, or */
  10. /* (at your option) any later version. */
  11. /* */
  12. /* This program is distributed in the hope that it will be useful, */
  13. /* but WITHOUT ANY WARRANTY; without even the implied warranty of */
  14. /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
  15. /* GNU General Public License for more details. */
  16. /* */
  17. /* You should have received a copy of the GNU General Public License */
  18. /* along with this program; if not, write to the Free Software */
  19. /* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA*/
  20. /* */
  21. /* Based on the translation algorithm by Gastin and Oddoux, */
  22. /* presented at the 13th International Conference on Computer Aided */
  23. /* Verification, CAV 2001, Paris, France. */
  24. /* Proceedings - LNCS 2102, pp. 53-65 */
  25. /* */
  26. /* Send bug-reports and/or questions to Paul Gastin */
  27. /* http://www.lsv.ens-cachan.fr/~gastin */
  28. /* */
  29. /* Some of the code in this file was taken from the Spin software */
  30. /* Written by Gerard J. Holzmann, Bell Laboratories, U.S.A. */
  31. #include "ltl2ba.h"
  32. extern int tl_yylex(void);
  33. extern int tl_verbose, tl_simp_log;
  34. int tl_yychar = 0;
  35. YYSTYPE tl_yylval;
  36. static Node *tl_formula(void);
  37. static Node *tl_factor(void);
  38. static Node *tl_level(int);
  39. static int prec[2][4] = {
  40. { U_OPER, V_OPER, 0, 0}, /* left associative */
  41. { OR, AND, IMPLIES, EQUIV, }, /* left associative */
  42. };
  43. static int
  44. implies(Node *a, Node *b)
  45. {
  46. return
  47. (isequal(a,b) ||
  48. b->ntyp == TRUE ||
  49. a->ntyp == FALSE ||
  50. (b->ntyp == AND && implies(a, b->lft) && implies(a, b->rgt)) ||
  51. (a->ntyp == OR && implies(a->lft, b) && implies(a->rgt, b)) ||
  52. (a->ntyp == AND && (implies(a->lft, b) || implies(a->rgt, b))) ||
  53. (b->ntyp == OR && (implies(a, b->lft) || implies(a, b->rgt))) ||
  54. (b->ntyp == U_OPER && implies(a, b->rgt)) ||
  55. (a->ntyp == V_OPER && implies(a->rgt, b)) ||
  56. (a->ntyp == U_OPER && implies(a->lft, b) && implies(a->rgt, b)) ||
  57. (b->ntyp == V_OPER && implies(a, b->lft) && implies(a, b->rgt)) ||
  58. ((a->ntyp == U_OPER || a->ntyp == V_OPER) && a->ntyp == b->ntyp &&
  59. implies(a->lft, b->lft) && implies(a->rgt, b->rgt)));
  60. }
  61. static Node *
  62. bin_simpler(Node *ptr)
  63. { Node *a, *b;
  64. if (ptr)
  65. switch (ptr->ntyp) {
  66. case U_OPER:
  67. if (ptr->rgt->ntyp == TRUE
  68. || ptr->rgt->ntyp == FALSE
  69. || ptr->lft->ntyp == FALSE)
  70. { ptr = ptr->rgt;
  71. break;
  72. }
  73. if (implies(ptr->lft, ptr->rgt)) /* NEW */
  74. { ptr = ptr->rgt;
  75. break;
  76. }
  77. if (ptr->lft->ntyp == U_OPER
  78. && isequal(ptr->lft->lft, ptr->rgt))
  79. { /* (p U q) U p = (q U p) */
  80. ptr->lft = ptr->lft->rgt;
  81. break;
  82. }
  83. if (ptr->rgt->ntyp == U_OPER
  84. && implies(ptr->lft, ptr->rgt->lft))
  85. { /* NEW */
  86. ptr = ptr->rgt;
  87. break;
  88. }
  89. #ifdef NXT
  90. /* X p U X q == X (p U q) */
  91. if (ptr->rgt->ntyp == NEXT
  92. && ptr->lft->ntyp == NEXT)
  93. { ptr = tl_nn(NEXT,
  94. tl_nn(U_OPER,
  95. ptr->lft->lft,
  96. ptr->rgt->lft), ZN);
  97. break;
  98. }
  99. /* NEW : F X p == X F p */
  100. if (ptr->lft->ntyp == TRUE &&
  101. ptr->rgt->ntyp == NEXT) {
  102. ptr = tl_nn(NEXT, tl_nn(U_OPER, True, ptr->rgt->lft), ZN);
  103. break;
  104. }
  105. #endif
  106. /* NEW : F G F p == G F p */
  107. if (ptr->lft->ntyp == TRUE &&
  108. ptr->rgt->ntyp == V_OPER &&
  109. ptr->rgt->lft->ntyp == FALSE &&
  110. ptr->rgt->rgt->ntyp == U_OPER &&
  111. ptr->rgt->rgt->lft->ntyp == TRUE) {
  112. ptr = ptr->rgt;
  113. break;
  114. }
  115. /* NEW */
  116. if (ptr->lft->ntyp != TRUE &&
  117. implies(push_negation(tl_nn(NOT, dupnode(ptr->rgt), ZN)),
  118. ptr->lft))
  119. { ptr->lft = True;
  120. break;
  121. }
  122. break;
  123. case V_OPER:
  124. if (ptr->rgt->ntyp == FALSE
  125. || ptr->rgt->ntyp == TRUE
  126. || ptr->lft->ntyp == TRUE)
  127. { ptr = ptr->rgt;
  128. break;
  129. }
  130. if (implies(ptr->rgt, ptr->lft))
  131. { /* p V p = p */
  132. ptr = ptr->rgt;
  133. break;
  134. }
  135. /* F V (p V q) == F V q */
  136. if (ptr->lft->ntyp == FALSE
  137. && ptr->rgt->ntyp == V_OPER)
  138. { ptr->rgt = ptr->rgt->rgt;
  139. break;
  140. }
  141. #ifdef NXT
  142. /* NEW : G X p == X G p */
  143. if (ptr->lft->ntyp == FALSE &&
  144. ptr->rgt->ntyp == NEXT) {
  145. ptr = tl_nn(NEXT, tl_nn(V_OPER, False, ptr->rgt->lft), ZN);
  146. break;
  147. }
  148. #endif
  149. /* NEW : G F G p == F G p */
  150. if (ptr->lft->ntyp == FALSE &&
  151. ptr->rgt->ntyp == U_OPER &&
  152. ptr->rgt->lft->ntyp == TRUE &&
  153. ptr->rgt->rgt->ntyp == V_OPER &&
  154. ptr->rgt->rgt->lft->ntyp == FALSE) {
  155. ptr = ptr->rgt;
  156. break;
  157. }
  158. /* NEW */
  159. if (ptr->rgt->ntyp == V_OPER
  160. && implies(ptr->rgt->lft, ptr->lft))
  161. { ptr = ptr->rgt;
  162. break;
  163. }
  164. /* NEW */
  165. if (ptr->lft->ntyp != FALSE &&
  166. implies(ptr->lft,
  167. push_negation(tl_nn(NOT, dupnode(ptr->rgt), ZN))))
  168. { ptr->lft = False;
  169. break;
  170. }
  171. break;
  172. #ifdef NXT
  173. case NEXT:
  174. /* NEW : X G F p == G F p */
  175. if (ptr->lft->ntyp == V_OPER &&
  176. ptr->lft->lft->ntyp == FALSE &&
  177. ptr->lft->rgt->ntyp == U_OPER &&
  178. ptr->lft->rgt->lft->ntyp == TRUE) {
  179. ptr = ptr->lft;
  180. break;
  181. }
  182. /* NEW : X F G p == F G p */
  183. if (ptr->lft->ntyp == U_OPER &&
  184. ptr->lft->lft->ntyp == TRUE &&
  185. ptr->lft->rgt->ntyp == V_OPER &&
  186. ptr->lft->rgt->lft->ntyp == FALSE) {
  187. ptr = ptr->lft;
  188. break;
  189. }
  190. break;
  191. #endif
  192. case IMPLIES:
  193. if (implies(ptr->lft, ptr->rgt))
  194. { ptr = True;
  195. break;
  196. }
  197. ptr = tl_nn(OR, Not(ptr->lft), ptr->rgt);
  198. ptr = rewrite(ptr);
  199. break;
  200. case EQUIV:
  201. if (implies(ptr->lft, ptr->rgt) &&
  202. implies(ptr->rgt, ptr->lft))
  203. { ptr = True;
  204. break;
  205. }
  206. a = rewrite(tl_nn(AND,
  207. dupnode(ptr->lft),
  208. dupnode(ptr->rgt)));
  209. b = rewrite(tl_nn(AND,
  210. Not(ptr->lft),
  211. Not(ptr->rgt)));
  212. ptr = tl_nn(OR, a, b);
  213. ptr = rewrite(ptr);
  214. break;
  215. case AND:
  216. /* p && (q U p) = p */
  217. if (ptr->rgt->ntyp == U_OPER
  218. && isequal(ptr->rgt->rgt, ptr->lft))
  219. { ptr = ptr->lft;
  220. break;
  221. }
  222. if (ptr->lft->ntyp == U_OPER
  223. && isequal(ptr->lft->rgt, ptr->rgt))
  224. { ptr = ptr->rgt;
  225. break;
  226. }
  227. /* p && (q V p) == q V p */
  228. if (ptr->rgt->ntyp == V_OPER
  229. && isequal(ptr->rgt->rgt, ptr->lft))
  230. { ptr = ptr->rgt;
  231. break;
  232. }
  233. if (ptr->lft->ntyp == V_OPER
  234. && isequal(ptr->lft->rgt, ptr->rgt))
  235. { ptr = ptr->lft;
  236. break;
  237. }
  238. /* (p U q) && (r U q) = (p && r) U q*/
  239. if (ptr->rgt->ntyp == U_OPER
  240. && ptr->lft->ntyp == U_OPER
  241. && isequal(ptr->rgt->rgt, ptr->lft->rgt))
  242. { ptr = tl_nn(U_OPER,
  243. tl_nn(AND, ptr->lft->lft, ptr->rgt->lft),
  244. ptr->lft->rgt);
  245. break;
  246. }
  247. /* (p V q) && (p V r) = p V (q && r) */
  248. if (ptr->rgt->ntyp == V_OPER
  249. && ptr->lft->ntyp == V_OPER
  250. && isequal(ptr->rgt->lft, ptr->lft->lft))
  251. { ptr = tl_nn(V_OPER,
  252. ptr->rgt->lft,
  253. tl_nn(AND, ptr->lft->rgt, ptr->rgt->rgt));
  254. break;
  255. }
  256. #ifdef NXT
  257. /* X p && X q == X (p && q) */
  258. if (ptr->rgt->ntyp == NEXT
  259. && ptr->lft->ntyp == NEXT)
  260. { ptr = tl_nn(NEXT,
  261. tl_nn(AND,
  262. ptr->rgt->lft,
  263. ptr->lft->lft), ZN);
  264. break;
  265. }
  266. #endif
  267. /* (p V q) && (r U q) == p V q */
  268. if (ptr->rgt->ntyp == U_OPER
  269. && ptr->lft->ntyp == V_OPER
  270. && isequal(ptr->lft->rgt, ptr->rgt->rgt))
  271. { ptr = ptr->lft;
  272. break;
  273. }
  274. if (isequal(ptr->lft, ptr->rgt) /* (p && p) == p */
  275. || ptr->rgt->ntyp == FALSE /* (p && F) == F */
  276. || ptr->lft->ntyp == TRUE /* (T && p) == p */
  277. || implies(ptr->rgt, ptr->lft))/* NEW */
  278. { ptr = ptr->rgt;
  279. break;
  280. }
  281. if (ptr->rgt->ntyp == TRUE /* (p && T) == p */
  282. || ptr->lft->ntyp == FALSE /* (F && p) == F */
  283. || implies(ptr->lft, ptr->rgt))/* NEW */
  284. { ptr = ptr->lft;
  285. break;
  286. }
  287. /* NEW : F G p && F G q == F G (p && q) */
  288. if (ptr->lft->ntyp == U_OPER &&
  289. ptr->lft->lft->ntyp == TRUE &&
  290. ptr->lft->rgt->ntyp == V_OPER &&
  291. ptr->lft->rgt->lft->ntyp == FALSE &&
  292. ptr->rgt->ntyp == U_OPER &&
  293. ptr->rgt->lft->ntyp == TRUE &&
  294. ptr->rgt->rgt->ntyp == V_OPER &&
  295. ptr->rgt->rgt->lft->ntyp == FALSE)
  296. {
  297. ptr = tl_nn(U_OPER, True,
  298. tl_nn(V_OPER, False,
  299. tl_nn(AND, ptr->lft->rgt->rgt,
  300. ptr->rgt->rgt->rgt)));
  301. break;
  302. }
  303. /* NEW */
  304. if (implies(ptr->lft,
  305. push_negation(tl_nn(NOT, dupnode(ptr->rgt), ZN)))
  306. || implies(ptr->rgt,
  307. push_negation(tl_nn(NOT, dupnode(ptr->lft), ZN))))
  308. { ptr = False;
  309. break;
  310. }
  311. break;
  312. case OR:
  313. /* p || (q U p) == q U p */
  314. if (ptr->rgt->ntyp == U_OPER
  315. && isequal(ptr->rgt->rgt, ptr->lft))
  316. { ptr = ptr->rgt;
  317. break;
  318. }
  319. /* p || (q V p) == p */
  320. if (ptr->rgt->ntyp == V_OPER
  321. && isequal(ptr->rgt->rgt, ptr->lft))
  322. { ptr = ptr->lft;
  323. break;
  324. }
  325. /* (p U q) || (p U r) = p U (q || r) */
  326. if (ptr->rgt->ntyp == U_OPER
  327. && ptr->lft->ntyp == U_OPER
  328. && isequal(ptr->rgt->lft, ptr->lft->lft))
  329. { ptr = tl_nn(U_OPER,
  330. ptr->rgt->lft,
  331. tl_nn(OR, ptr->lft->rgt, ptr->rgt->rgt));
  332. break;
  333. }
  334. if (isequal(ptr->lft, ptr->rgt) /* (p || p) == p */
  335. || ptr->rgt->ntyp == FALSE /* (p || F) == p */
  336. || ptr->lft->ntyp == TRUE /* (T || p) == T */
  337. || implies(ptr->rgt, ptr->lft))/* NEW */
  338. { ptr = ptr->lft;
  339. break;
  340. }
  341. if (ptr->rgt->ntyp == TRUE /* (p || T) == T */
  342. || ptr->lft->ntyp == FALSE /* (F || p) == p */
  343. || implies(ptr->lft, ptr->rgt))/* NEW */
  344. { ptr = ptr->rgt;
  345. break;
  346. }
  347. /* (p V q) || (r V q) = (p || r) V q */
  348. if (ptr->rgt->ntyp == V_OPER
  349. && ptr->lft->ntyp == V_OPER
  350. && isequal(ptr->lft->rgt, ptr->rgt->rgt))
  351. { ptr = tl_nn(V_OPER,
  352. tl_nn(OR, ptr->lft->lft, ptr->rgt->lft),
  353. ptr->rgt->rgt);
  354. break;
  355. }
  356. /* (p V q) || (r U q) == r U q */
  357. if (ptr->rgt->ntyp == U_OPER
  358. && ptr->lft->ntyp == V_OPER
  359. && isequal(ptr->lft->rgt, ptr->rgt->rgt))
  360. { ptr = ptr->rgt;
  361. break;
  362. }
  363. /* NEW : G F p || G F q == G F (p || q) */
  364. if (ptr->lft->ntyp == V_OPER &&
  365. ptr->lft->lft->ntyp == FALSE &&
  366. ptr->lft->rgt->ntyp == U_OPER &&
  367. ptr->lft->rgt->lft->ntyp == TRUE &&
  368. ptr->rgt->ntyp == V_OPER &&
  369. ptr->rgt->lft->ntyp == FALSE &&
  370. ptr->rgt->rgt->ntyp == U_OPER &&
  371. ptr->rgt->rgt->lft->ntyp == TRUE)
  372. {
  373. ptr = tl_nn(V_OPER, False,
  374. tl_nn(U_OPER, True,
  375. tl_nn(OR, ptr->lft->rgt->rgt,
  376. ptr->rgt->rgt->rgt)));
  377. break;
  378. }
  379. /* NEW */
  380. if (implies(push_negation(tl_nn(NOT, dupnode(ptr->rgt), ZN)),
  381. ptr->lft)
  382. || implies(push_negation(tl_nn(NOT, dupnode(ptr->lft), ZN)),
  383. ptr->rgt))
  384. { ptr = True;
  385. break;
  386. }
  387. break;
  388. }
  389. return ptr;
  390. }
  391. static Node *
  392. bin_minimal(Node *ptr)
  393. { if (ptr)
  394. switch (ptr->ntyp) {
  395. case IMPLIES:
  396. return tl_nn(OR, Not(ptr->lft), ptr->rgt);
  397. case EQUIV:
  398. return tl_nn(OR,
  399. tl_nn(AND,dupnode(ptr->lft),dupnode(ptr->rgt)),
  400. tl_nn(AND,Not(ptr->lft),Not(ptr->rgt)));
  401. }
  402. return ptr;
  403. }
  404. static Node *
  405. tl_factor(void)
  406. { Node *ptr = ZN;
  407. switch (tl_yychar) {
  408. case '(':
  409. ptr = tl_formula();
  410. if (tl_yychar != ')')
  411. tl_yyerror("expected ')'");
  412. tl_yychar = tl_yylex();
  413. goto simpl;
  414. case NOT:
  415. ptr = tl_yylval;
  416. tl_yychar = tl_yylex();
  417. ptr->lft = tl_factor();
  418. ptr = push_negation(ptr);
  419. goto simpl;
  420. case ALWAYS:
  421. tl_yychar = tl_yylex();
  422. ptr = tl_factor();
  423. if(tl_simp_log) {
  424. if (ptr->ntyp == FALSE
  425. || ptr->ntyp == TRUE)
  426. break; /* [] false == false */
  427. if (ptr->ntyp == V_OPER)
  428. { if (ptr->lft->ntyp == FALSE)
  429. break; /* [][]p = []p */
  430. ptr = ptr->rgt; /* [] (p V q) = [] q */
  431. }
  432. }
  433. ptr = tl_nn(V_OPER, False, ptr);
  434. goto simpl;
  435. #ifdef NXT
  436. case NEXT:
  437. tl_yychar = tl_yylex();
  438. ptr = tl_factor();
  439. if ((ptr->ntyp == TRUE || ptr->ntyp == FALSE)&& tl_simp_log)
  440. break; /* X true = true , X false = false */
  441. ptr = tl_nn(NEXT, ptr, ZN);
  442. goto simpl;
  443. #endif
  444. case EVENTUALLY:
  445. tl_yychar = tl_yylex();
  446. ptr = tl_factor();
  447. if(tl_simp_log) {
  448. if (ptr->ntyp == TRUE
  449. || ptr->ntyp == FALSE)
  450. break; /* <> true == true */
  451. if (ptr->ntyp == U_OPER
  452. && ptr->lft->ntyp == TRUE)
  453. break; /* <><>p = <>p */
  454. if (ptr->ntyp == U_OPER)
  455. { /* <> (p U q) = <> q */
  456. ptr = ptr->rgt;
  457. /* fall thru */
  458. }
  459. }
  460. ptr = tl_nn(U_OPER, True, ptr);
  461. simpl:
  462. if (tl_simp_log)
  463. ptr = bin_simpler(ptr);
  464. break;
  465. case PREDICATE:
  466. ptr = tl_yylval;
  467. tl_yychar = tl_yylex();
  468. break;
  469. case TRUE:
  470. case FALSE:
  471. ptr = tl_yylval;
  472. tl_yychar = tl_yylex();
  473. break;
  474. }
  475. if (!ptr) tl_yyerror("expected predicate");
  476. #if 0
  477. printf("factor: ");
  478. tl_explain(ptr->ntyp);
  479. printf("\n");
  480. #endif
  481. return ptr;
  482. }
  483. static Node *
  484. tl_level(int nr)
  485. { int i; Node *ptr = ZN;
  486. if (nr < 0)
  487. return tl_factor();
  488. ptr = tl_level(nr-1);
  489. again:
  490. for (i = 0; i < 4; i++)
  491. if (tl_yychar == prec[nr][i])
  492. { tl_yychar = tl_yylex();
  493. ptr = tl_nn(prec[nr][i],
  494. ptr, tl_level(nr-1));
  495. if(tl_simp_log) ptr = bin_simpler(ptr);
  496. else ptr = bin_minimal(ptr);
  497. goto again;
  498. }
  499. if (!ptr) tl_yyerror("syntax error");
  500. #if 0
  501. printf("level %d: ", nr);
  502. tl_explain(ptr->ntyp);
  503. printf("\n");
  504. #endif
  505. return ptr;
  506. }
  507. static Node *
  508. tl_formula(void)
  509. { tl_yychar = tl_yylex();
  510. return tl_level(1); /* 2 precedence levels, 1 and 0 */
  511. }
  512. void
  513. tl_parse(void)
  514. { Node *n = tl_formula();
  515. if (tl_verbose)
  516. { printf("formula: ");
  517. put_uform();
  518. printf("\n");
  519. }
  520. trans(n);
  521. }