ex3.d.smv 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. MODULE passenger(on_boat)
  2. VAR
  3. crossed : boolean;
  4. ASSIGN
  5. init(crossed) := FALSE;
  6. next(crossed) := on_boat ? !crossed : crossed;
  7. MODULE main
  8. VAR
  9. selected_passenger_1 : {h1, w1, h2, w2, h3, w3, h4, w4};
  10. selected_passenger_2 : {h1, w1, h2, w2, h3, w3, h4, w4, none};
  11. selected_passenger_3 : {h1, w1, h2, w2, h3, w3, h4, w4, none};
  12. boat_crossed : boolean;
  13. husband1 : passenger(
  14. h1 in {selected_passenger_1, selected_passenger_2, selected_passenger_3}
  15. );
  16. wife1 : passenger(
  17. w1 in {selected_passenger_1, selected_passenger_2, selected_passenger_3}
  18. );
  19. husband2 : passenger(
  20. h2 in {selected_passenger_1, selected_passenger_2, selected_passenger_3}
  21. );
  22. wife2 : passenger(
  23. w2 in {selected_passenger_1, selected_passenger_2, selected_passenger_3}
  24. );
  25. husband3 : passenger(
  26. h3 in {selected_passenger_1, selected_passenger_2, selected_passenger_3}
  27. );
  28. wife3 : passenger(
  29. w3 in {selected_passenger_1, selected_passenger_2, selected_passenger_3}
  30. );
  31. husband4 : passenger(
  32. h4 in {selected_passenger_1, selected_passenger_2, selected_passenger_3}
  33. );
  34. wife4 : passenger(
  35. w4 in {selected_passenger_1, selected_passenger_2, selected_passenger_3}
  36. );
  37. ASSIGN
  38. init(boat_crossed) := FALSE;
  39. next(boat_crossed) := !boat_crossed;
  40. next(selected_passenger_1) := {
  41. next(boat_crossed) = husband1.crossed ? h1 : selected_passenger_1,
  42. next(boat_crossed) = wife1.crossed ? w1 : selected_passenger_1,
  43. next(boat_crossed) = husband2.crossed ? h2 : selected_passenger_1,
  44. next(boat_crossed) = wife2.crossed ? w2 : selected_passenger_1,
  45. next(boat_crossed) = husband3.crossed ? h3 : selected_passenger_1,
  46. next(boat_crossed) = wife3.crossed ? w3 : selected_passenger_1,
  47. next(boat_crossed) = husband4.crossed ? h4 : selected_passenger_1,
  48. next(boat_crossed) = wife4.crossed ? w4 : selected_passenger_1
  49. };
  50. init(selected_passenger_2) := {
  51. selected_passenger_1 != h1 ? h1 : none,
  52. selected_passenger_1 != w1 ? w1 : none,
  53. selected_passenger_1 != h2 ? h2 : none,
  54. selected_passenger_1 != w2 ? w2 : none,
  55. selected_passenger_1 != h3 ? h3 : none,
  56. selected_passenger_1 != w3 ? w3 : none,
  57. selected_passenger_1 != h4 ? h4 : none,
  58. selected_passenger_1 != w4 ? w4 : none
  59. };
  60. next(selected_passenger_2) := {
  61. next(boat_crossed) = husband1.crossed & next(selected_passenger_1) != h1 ? h1 : selected_passenger_2,
  62. next(boat_crossed) = wife1.crossed & next(selected_passenger_1) != w1 ? w1 : selected_passenger_2,
  63. next(boat_crossed) = husband2.crossed & next(selected_passenger_1) != h2 ? h2 : selected_passenger_2,
  64. next(boat_crossed) = wife2.crossed & next(selected_passenger_1) != w2 ? w2 : selected_passenger_2,
  65. next(boat_crossed) = husband3.crossed & next(selected_passenger_1) != h3 ? h3 : selected_passenger_2,
  66. next(boat_crossed) = wife3.crossed & next(selected_passenger_1) != w3 ? w3 : selected_passenger_2,
  67. next(boat_crossed) = husband4.crossed & next(selected_passenger_1) != h4 ? h4 : selected_passenger_2,
  68. next(boat_crossed) = wife4.crossed & next(selected_passenger_1) != w4 ? w4 : selected_passenger_2,
  69. none
  70. };
  71. -- new initialization constraints added
  72. -- in essence, same as we did in (b)
  73. init(selected_passenger_3) := {
  74. (selected_passenger_1 != h1 & selected_passenger_2 != h1) ? h1 : none,
  75. (selected_passenger_1 != w1 & selected_passenger_2 != w1) ? w1 : none,
  76. (selected_passenger_1 != h2 & selected_passenger_2 != h2) ? h2 : none,
  77. (selected_passenger_1 != w2 & selected_passenger_2 != w2) ? w2 : none,
  78. (selected_passenger_1 != h3 & selected_passenger_2 != h3) ? h3 : none,
  79. (selected_passenger_1 != w3 & selected_passenger_2 != w3) ? w3 : none,
  80. (selected_passenger_1 != h4 & selected_passenger_2 != h4) ? h4 : none,
  81. (selected_passenger_1 != w4 & selected_passenger_2 != w4) ? w4 : none
  82. };
  83. -- new transition added
  84. -- in essence, we do the same we did in (b), only this time making sure
  85. -- that selected_passenger_3 is unlike selected_passenger_1 and selected_passenger_2
  86. next(selected_passenger_3) := {
  87. next(boat_crossed) = husband1.crossed &
  88. next(selected_passenger_1) != h1 &
  89. next(selected_passenger_2) != h1 ?
  90. h1 : selected_passenger_2,
  91. next(boat_crossed) = wife1.crossed &
  92. next(selected_passenger_1) != w1 &
  93. next(selected_passenger_2) != w1 ?
  94. w1 : selected_passenger_2,
  95. next(boat_crossed) = husband2.crossed &
  96. next(selected_passenger_1) != h2 &
  97. next(selected_passenger_2) != h2 ?
  98. h2 : selected_passenger_2,
  99. next(boat_crossed) = wife2.crossed &
  100. next(selected_passenger_1) != w2 &
  101. next(selected_passenger_2) != w2 ?
  102. w2 : selected_passenger_2,
  103. next(boat_crossed) = husband3.crossed &
  104. next(selected_passenger_1) != h3 &
  105. next(selected_passenger_2) != h3 ?
  106. h3 : selected_passenger_2,
  107. next(boat_crossed) = wife3.crossed &
  108. next(selected_passenger_1) != w3 &
  109. next(selected_passenger_2) != w3 ?
  110. w3 : selected_passenger_2,
  111. next(boat_crossed) = husband4.crossed &
  112. next(selected_passenger_1) != h4 &
  113. next(selected_passenger_2) != h4 ?
  114. h4 : selected_passenger_2,
  115. next(boat_crossed) = wife4.crossed &
  116. next(selected_passenger_1) != w4 &
  117. next(selected_passenger_2) != w4 ?
  118. w4 : selected_passenger_2,
  119. none
  120. };
  121. DEFINE
  122. is_jealous_h1 := (
  123. husband1.crossed != wife1.crossed & (
  124. wife1.crossed = husband2.crossed |
  125. wife1.crossed = husband3.crossed |
  126. wife1.crossed = husband4.crossed
  127. ));
  128. is_jealous_h2 := (
  129. husband2.crossed != wife2.crossed & (
  130. wife2.crossed = husband1.crossed |
  131. wife2.crossed = husband3.crossed |
  132. wife2.crossed = husband4.crossed
  133. ));
  134. is_jealous_h3 := (
  135. husband3.crossed != wife3.crossed & (
  136. wife3.crossed = husband1.crossed |
  137. wife3.crossed = husband2.crossed |
  138. wife3.crossed = husband4.crossed
  139. ));
  140. is_jealous_h4 := (
  141. husband4.crossed != wife4.crossed & (
  142. wife4.crossed = husband1.crossed |
  143. wife4.crossed = husband2.crossed |
  144. wife4.crossed = husband3.crossed
  145. ));
  146. all_crossed := (
  147. husband1.crossed & wife1.crossed &
  148. husband2.crossed & wife2.crossed &
  149. husband3.crossed & wife3.crossed &
  150. husband4.crossed & wife4.crossed);
  151. LTLSPEC ! (
  152. G !(is_jealous_h1 | is_jealous_h2 | is_jealous_h3 | is_jealous_h4) &
  153. F all_crossed
  154. );