Я работал над этим простым упражнением о написании сертифицированной функции с использованием типов подмножеств. Идея заключается в том, чтобы сначала написать функцию-предшественникаАнализ случая Coq и переписывание с функцией, возвращающей типы подмножеств
pred : forall (n : {n : nat | n > 0}), {m : nat | S m = n.1}.
, а затем использовать это определение дать FUNTION
pred2 : forall (n : {n : nat | n > 1}), {m : nat | S (S m) = n.1}.
У меня нет никаких проблем с первым. Вот мой код
Program Definition pred (n : {n : nat | n > 0}) : {m : nat | S m = n.1} :=
match n with
| O => _
| S n' => n'
end.
Next Obligation. elimtype False. compute in H. inversion H. Qed.
Но я не могу тренировать второе определение. Я пытаюсь написать эти определения
Program Definition pred2 (n : {n : nat | n > 1}) : {m : nat | S (S m) = n.1}
:= pred (pred n).
мне удалось доказать два первых обязательство
Next Obligation. apply (gt_trans n 1 0). assumption. auto. Qed.
Next Obligation.
destruct pred.
simpl.
simpl in e.
rewrite <- e in H.
apply gt_S_n in H; assumption.
Qed.
Но для последнего обязательства я застрял, потому что, когда я пытаюсь сделать анализ случая для типа возвращаемого пред новой гипотезы не переписаны в цели.
Я пробовал следующую тактику безрезультатно.
destruct (pred (n: pred2_obligation_1 (n ; H))).
destruct (pred (n; pred2_obligation_1 (n ; H))) eqn:?.
rewrite Heqs.
Я знаю, что могу писать непосредственно с pred2, но идея заключается в том, чтобы использовать и составлять функцию pred.
Меня интересует множество упражнений, которые у вас есть. Где-то они доступны в Интернете? Можете ли вы опубликовать ссылку или условия поиска Google? – Atsby
Я делаю это упражнение http://www.cis.upenn.edu/~bcpierce/courses/670Fall12/ –