证明过程忙于 combine_split
Proof Process busy on combine_split
我正在做软件基础练习和 combine_split
练习 我在尝试证明辅助引理时 运行 碰壁了。
当在 assert
中应用 reflexivity
时,证明过程只是挂在那里,尽管等式只是 (x, y) = (x, y)
,这显然是正确的。
下面是实现
Theorem combine_split : forall X Y (l : list (X * Y)) l1 l2,
split l = (l1, l2) ->
combine l1 l2 = l.
Proof.
intros X Y.
intros l.
induction l as [| n l' IHl'].
- simpl. intros l1 l2 H. injection H as H1 H2. rewrite <- H1, <-H2. reflexivity.
- destruct n as [n1 n2]. simpl. destruct (split l').
intros l1 l2 H. injection H as H1 H2.
rewrite <- H1, <- H2. simpl.
assert ( Hc : combine x y = l'). { apply IHl'. reflexivity.}
apply Hc.
Qed.
为什么会这样?
看起来像是 Proof General 中的一个解析错误,在它的句子拆分中。当您希望它拆分为 reflexivity.
然后 }
作为单独的命令时,它似乎是根据突出显示将 reflexivity.}
发送到 Coq。在任何情况下,coqc
都不会 lex 这符合预期,将 .}
解释为单个(未知)标记。 (我真的很困惑为什么如果它发送 reflexivity.}
你不会得到那个词法分析错误。)
您可以通过添加 space 来解决此问题:reflexivity. }
我正在做软件基础练习和 combine_split
练习 我在尝试证明辅助引理时 运行 碰壁了。
当在 assert
中应用 reflexivity
时,证明过程只是挂在那里,尽管等式只是 (x, y) = (x, y)
,这显然是正确的。
下面是实现
Theorem combine_split : forall X Y (l : list (X * Y)) l1 l2,
split l = (l1, l2) ->
combine l1 l2 = l.
Proof.
intros X Y.
intros l.
induction l as [| n l' IHl'].
- simpl. intros l1 l2 H. injection H as H1 H2. rewrite <- H1, <-H2. reflexivity.
- destruct n as [n1 n2]. simpl. destruct (split l').
intros l1 l2 H. injection H as H1 H2.
rewrite <- H1, <- H2. simpl.
assert ( Hc : combine x y = l'). { apply IHl'. reflexivity.}
apply Hc.
Qed.
为什么会这样?
看起来像是 Proof General 中的一个解析错误,在它的句子拆分中。当您希望它拆分为 reflexivity.
然后 }
作为单独的命令时,它似乎是根据突出显示将 reflexivity.}
发送到 Coq。在任何情况下,coqc
都不会 lex 这符合预期,将 .}
解释为单个(未知)标记。 (我真的很困惑为什么如果它发送 reflexivity.}
你不会得到那个词法分析错误。)
您可以通过添加 space 来解决此问题:reflexivity. }