ex3.c.smv 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  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. boat_crossed : boolean;
  12. husband1 : passenger(
  13. h1 in {selected_passenger_1, selected_passenger_2}
  14. );
  15. wife1 : passenger(
  16. w1 in {selected_passenger_1, selected_passenger_2}
  17. );
  18. husband2 : passenger(
  19. h2 in {selected_passenger_1, selected_passenger_2}
  20. );
  21. wife2 : passenger(
  22. w2 in {selected_passenger_1, selected_passenger_2}
  23. );
  24. husband3 : passenger(
  25. h3 in {selected_passenger_1, selected_passenger_2}
  26. );
  27. wife3 : passenger(
  28. w3 in {selected_passenger_1, selected_passenger_2}
  29. );
  30. husband4 : passenger(
  31. h4 in {selected_passenger_1, selected_passenger_2}
  32. );
  33. wife4 : passenger(
  34. w4 in {selected_passenger_1, selected_passenger_2}
  35. );
  36. ASSIGN
  37. init(boat_crossed) := FALSE;
  38. next(boat_crossed) := !boat_crossed;
  39. -- extended by a new pairing
  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. -- extended by a new pairing
  51. init(selected_passenger_2) := {
  52. selected_passenger_1 != h1 ? h1 : none,
  53. selected_passenger_1 != w1 ? w1 : none,
  54. selected_passenger_1 != h2 ? h2 : none,
  55. selected_passenger_1 != w2 ? w2 : none,
  56. selected_passenger_1 != h3 ? h3 : none,
  57. selected_passenger_1 != w3 ? w3 : none,
  58. selected_passenger_1 != h4 ? h4 : none,
  59. selected_passenger_1 != w4 ? w4 : none
  60. };
  61. -- extended by a new pairing
  62. next(selected_passenger_2) := {
  63. next(boat_crossed) = husband1.crossed & next(selected_passenger_1) != h1 ? h1 : selected_passenger_2,
  64. next(boat_crossed) = wife1.crossed & next(selected_passenger_1) != w1 ? w1 : selected_passenger_2,
  65. next(boat_crossed) = husband2.crossed & next(selected_passenger_1) != h2 ? h2 : selected_passenger_2,
  66. next(boat_crossed) = wife2.crossed & next(selected_passenger_1) != w2 ? w2 : selected_passenger_2,
  67. next(boat_crossed) = husband3.crossed & next(selected_passenger_1) != h3 ? h3 : selected_passenger_2,
  68. next(boat_crossed) = wife3.crossed & next(selected_passenger_1) != w3 ? w3 : selected_passenger_2,
  69. next(boat_crossed) = husband4.crossed & next(selected_passenger_1) != h4 ? h4 : selected_passenger_2,
  70. next(boat_crossed) = wife4.crossed & next(selected_passenger_1) != w4 ? w4 : selected_passenger_2,
  71. none
  72. };
  73. DEFINE
  74. is_jealous_h1 := (
  75. husband1.crossed != wife1.crossed & (
  76. wife1.crossed = husband2.crossed |
  77. wife1.crossed = husband3.crossed |
  78. wife1.crossed = husband4.crossed
  79. ));
  80. is_jealous_h2 := (
  81. husband2.crossed != wife2.crossed & (
  82. wife2.crossed = husband1.crossed |
  83. wife2.crossed = husband3.crossed |
  84. wife2.crossed = husband4.crossed
  85. ));
  86. is_jealous_h3 := (
  87. husband3.crossed != wife3.crossed & (
  88. wife3.crossed = husband1.crossed |
  89. wife3.crossed = husband2.crossed |
  90. wife3.crossed = husband4.crossed
  91. ));
  92. -- extended by a pairing
  93. is_jealous_h4 := (
  94. husband4.crossed != wife4.crossed & (
  95. wife4.crossed = husband1.crossed |
  96. wife4.crossed = husband2.crossed |
  97. wife4.crossed = husband3.crossed
  98. ));
  99. -- extended by a pairing
  100. all_crossed := (
  101. husband1.crossed & wife1.crossed &
  102. husband2.crossed & wife2.crossed &
  103. husband3.crossed & wife3.crossed &
  104. husband4.crossed & wife4.crossed);
  105. -- extended by a pairing
  106. LTLSPEC ! (
  107. G !(is_jealous_h1 | is_jealous_h2 | is_jealous_h3 | is_jealous_h4) &
  108. F all_crossed
  109. );