(* The definition of mydata again, for completeness *)
Inductive mydata : Set :=
| part1 : mydata
| part2 : mydata
| part3 : mydata.
Вы можете определить сравнение как логическую функцию mydata -> mydata -> bool
:
Definition le_mydata_dec (d1 d2 : mydata) : bool :=
match d1, d2 with
| part1, _ => true
| part2, (part2 | part3) => true
| part3, part3 => true
| _, _ => false
end.
И из этого получим отношение сравнения mydata -> mydata -> Prop
(это только один способ, иногда удобнее определить le_mydata
как Inductive
предложение).
Definition le_mydata (d1 d2 : mydata) : Prop :=
le_mydata_dec d1 d2 = true.
Функция отображения такая же (переименована f
для краткости):
(* a sample function from nat to mydata which is always increasing or not changing*)
Definition f
(a1:nat): mydata :=
match a1 with
|0=> part1
|S(0) => part2
|_ => part3
end.
Теперь это монотонность:
Theorem f_isMonotonic: forall(a1 a2: nat),
a1<=a2 -> le_mydata (f a1) (f a2).
Proof.
Abort.
Вы можете использовать нотации для замены le_mydata
на более симпатичный <=
. Здесь мы стараемся не скрывать ранее существовавшую нотацию <=
для сравнения nat
, назначая эту новую нотацию новой области действия mydata_scope
, разделенной ключом mydata
.
Infix "<=" := le_mydata : mydata_scope.
Delimit Scope mydata_scope with mydata.
(* now we can write (x <= y)%mydata instead of le_mydata x y *)
Снова теорема о монотонности, используя эти обозначения:
Theorem f_isMonotonic: forall(a1 a2: nat),
a1<=a2 -> (f a1 <= f a2)%mydata.
Proof.
Abort.