3 In a system like Matita's very few things are built-in: not even booleans or logical connectives.
4 The main philosophy od the system is to let you define your own data-types and functions using a powerful computational
5 mechanism based on the declaration of inductive types.
7 Let us start this tutorial with a simple example based on the following well known problem.
9 \ 5h2 class="section"
\ 6The goat, the wolf and the cabbage
\ 5/h2
\ 6\ 5div class="paragraph"
\ 6\ 5/div
\ 6A farmer need to tranfer a goat, a wolf and a cabbage across a river, but there is only one place available
10 on his boat. Furthermore, the goat will eat the cabbage if they are left alone on the same bank, and similarly
11 the wolf will eat the goat. The problem consists in bringing all three item safely across the river.
13 Our first data type defines the two banks of the river, which we will call east and west. It is a simple
14 example of enumerated type, defined by explicitly declaring all its elements. The type itself is called
19 include "basics/pts.ma".
21 inductive bank: Type[0] ≝
25 (* We can now define a simple function computing, for each bank of the river,
28 definition opposite ≝ λs.
34 lemma east_to_west : change_side east = west.
37 lemma west_to_east : change_side west = east.
40 lemma change_twice : ∀x. change_side (change_side x) = x.
44 inductive item: Type[0] ≝
50 (* definition state ≝ item → side. *)
52 record state : Type[0] ≝
58 definition state_of_item ≝ λs,i.
62 | cabbage ⇒ cabbage_pos s
66 definition is_movable ≝ λs,i.
67 state_of_item s i = state_of_item s boat.
69 record movable_item (s:state) : Type[0] ≝
71 mov : is_movable s elem}. *)
73 definition start :state ≝
74 mk_state east east east east.
77 inductive move : state → state → Type[0] ≝
79 move (mk_state (change_side g) w c (change_side g)) (mk_state g w c g)
81 move (mk_state g (change_side w) c (change_side w)) (mk_state g w c w)
82 | move_cabbage: ∀g,w,c.
83 move (mk_state g w (change_side c) (change_side c)) (mk_state g w c c)
84 | move_boat: ∀g,w,c,b.
85 move (mk_state g w c (change_side b)) (mk_state g w c b).
88 (* this is working well *)
89 inductive move : state → state → Type[0] ≝
91 move (mk_state g w c g) (mk_state (change_side g) w c (change_side g))
93 move (mk_state g w c w) (mk_state g (change_side w) c (change_side w))
94 | move_cabbage: ∀g,w,c.
95 move (mk_state g w c c) (mk_state g w (change_side c) (change_side c))
96 | move_boat: ∀g,w,c,b.
97 move (mk_state g w c b) (mk_state g w c (change_side b)).
101 inductive move : state → state → Type[0] ≝
102 | move_goat: ∀g,g1,w,c. change_side g = g1 →
103 move (mk_state g w c g) (mk_state g1 w c g1)
104 | move_wolf: ∀g,w,w1,c. change_side w = w1 →
105 move (mk_state g w c w) (mk_state g w1 c w1)
106 | move_cabbage: ∀g,w,c,c1. change_side c = c1 →
107 move (mk_state g w c c) (mk_state g w c1 c1)
108 | move_boat: ∀g,w,c,b,b1. change_side b = b1 →
109 move (mk_state g w c b) (mk_state g w c b1)
113 inductive move : state →state → Type[0] ≝
114 | move_goat: ∀s.∀h:is_movable s goat. move s (mk_state (change_side (goat_pos s)) (wolf_pos s)
115 (cabbage_pos s) (change_side (boat_pos s)))
116 | move_wolf: ∀s.∀h:is_movable s wolf. move s (mk_state (goat_pos s) (change_side (wolf_pos s))
117 (cabbage_pos s) (change_side (boat_pos s)))
118 | move_cabbage: ∀s.∀h:is_movable s cabbage. move s (mk_state (goat_pos s) (wolf_pos s)
119 (change_side (cabbage_pos s)) (change_side (boat_pos s)))
120 | move_boat: ∀s.move s (mk_state (goat_pos s) (wolf_pos s)
121 (cabbage_pos s) (change_side (boat_pos s))).
125 definition legal_state ≝ λs.
126 goat_pos s = boat_pos s ∨
127 (goat_pos s = change_side (cabbage_pos s) ∧
128 goat_pos s = change_side (wolf_pos s)). *)
130 inductive legal_state : state → Prop ≝
131 | with_boat : ∀g,w,c.legal_state (mk_state g w c g)
132 | opposite_side : ∀g,b.
133 legal_state (mk_state g (change_side g) (change_side g) b).
135 inductive reachable : state → state → Prop ≝
136 | one : ∀s1,s2.move s1 s2 → reachable s1 s2
137 | more : ∀s1,s2,s3. reachable s1 s2 → legal_state s2 → move s2 s3 →
140 definition end ≝ mk_state west west west west.
141 definition second ≝ mk_state west east east west.
142 definition third ≝ mk_state west east east east.
143 definition fourth ≝ mk_state west west east west.
144 definition fifth ≝ mk_state east west east east.
145 definition sixth ≝ mk_state east west west west.
146 definition seventh ≝ mk_state east west west east.
148 lemma problem: reachable start end.
151 lemma problem: reachable start end.
153 @more [4: @move_goat || 3: //]
154 @more [4: @move_boat || 3: //]
155 @more [4: @move_wolf || 3: //]
156 @more [4: @move_goat || 3: //]
157 @more [4: @move_cabbage || 3: //]
158 @more [4: @move_boat || 3: //]
164 definition move_item ≝ λs.λi:movable_item s.
165 match (elem ? i) with
166 [ goat ⇒ mk_state (change_side (goat_pos s)) (wolf_pos s)
167 (cabbage_pos s) (change_side (boat_pos s))
168 | wolf ⇒ mk_state (goat_pos s) (change_side (wolf_pos s))
169 (cabbage_pos s) (change_side (boat_pos s))
170 | cabbage ⇒ mk_state (goat_pos s) (wolf_pos s)
171 (change_side (cabbage_pos s)) (change_side (boat_pos s))
172 | boat ⇒ mk_state (goat_pos s) (wolf_pos s)
173 (cabbage_pos s) (change_side (boat_pos s))
176 definition legal_state ≝ λs.
177 cabbage_pos s = goat_pos s ∨
178 goat_pos s = wolf_pos s → goat_pos s = boat_pos s.
180 definition legal_step ≝ λs1,s2.
181 ∃i.move_item s1 i = s2.
183 inductive reachable : state → state → Prop ≝
184 | nil : ∀s.reachable s s
185 | step : ∀s1,s2,s3. legal_step s1 s2 → legal_state s2 → reachable s2 s3 →
188 definition second ≝ mk_state west east east west.
189 definition end ≝ mk_state west west west west.
191 lemma goat_move: ∀s.legal_step s (mk_state (change_side (goat_pos s)) (wolf_pos s)
192 (cabbage_pos s) (change_side (boat_pos s))).
194 lemma problem: reachable start second.
195 @step [| @ex_intro // [| @move_goat ] // | //]
197 [|| @move_goat //| //