Пока тип результата вашей леммы равен Prop
, Coq на самом деле не волнует, как вы заполняете подцели во время его доказательства. Заполняя подцели, вы, по сути, предоставляете значение этого типа цели.
Примите во внимание следующее:
Если вы встретите цель True
, вы можете явно заполнитьцель путем предоставления значения типа True
, а именно I
.На языке тактики вы могли бы написать:
1 subgoal
______________________________________(1/1)
True
exact I. (* explicit way, or *)
constructor. (* less explicit way *)
No more subgoals.
Иметь цель типа nat
- это то же самое.Очевидно, что O
является значением типа nat
(как и любое натуральное число, например 12432523547835
), поэтому вы можете заполнить его следующим образом:
1 subgoal
______________________________________(1/1)
nat
exact O. (* this obviously works *)
exact 12432523547835. (* this does work too *)
No more subgoals.
Возможно, не связано,но цель или тип nat
или любой другой тип полностью имеет смысл в контексте «написания определения в режиме доказательства».Например, функция
Definition double (x : nat) : nat := x + x.
может быть определена таким образом (однако не делайте этого, если целевой тип не является сложным зависимым типом и результат не может быть легко сформулирован классическим способом):
Definition double (x : nat) : nat.
1 subgoal
x : nat
______________________________________(1/1)
nat
exact (x + x). (* Fill the goal with desired value *)
No more subgoals.
Defined. (* Use this instead of Qed to allow Coq to unfold the definition *)
Print double. (* Checking that the function body is correct *)
double = fun x : nat => x + x
: nat -> nat
Мне кажется, я когда-то сталкивался с подобным случаем, когда я писал доказательство для обоснованной рекурсивной функции, и я как-то применил неверную гипотезу (то есть определяемая функция,что на самом деле не является гипотезой) к цели.Но я все еще мог завершить доказательство, и определенная функция работала как ожидалось.