玩 nostutter excersizes 我发现了另一种奇怪的行为。这是代码:
Inductive nostutter {X:Type} : list X -> Prop :=
| ns_nil : nostutter []
| ns_one : forall (x : X), nostutter [x]
| ns_cons: forall (x : X) (h : X) (t : list X), nostutter (h::t) -> x <> h -> nostutter (x::h::t).
Example test_nostutter_manual: not (nostutter [3;1;1;4]).
Proof.
intro.
inversion_clear H.
inversion_clear H0.
unfold not in H2.
(* We are here *)
specialize (H2 eq_refl).
apply H2.
Qed.
展开后的状态是这样的:
1 subgoal (ID 229)
H1 : 3 <> 1
H : nostutter [1; 4]
H2 : 1 = 1 -> False
============================
False
当我specialize (H2 eq_refl).
在加载其他逻辑基础文件的 IndProp.v 中运行时,它可以工作。不知何故,它明白需要将“1”作为参数。IndProp.v 的标题是这样的:
Set Warnings "-notation-overridden,-parsing".
From LF Require Export Logic.
Require Import String.
Require Coq.omega.Omega.
当我将代码移动到另一个文件“nostutter.v”中时,同样的代码给出了预期的错误:
术语“eq_refl”的类型为“RelationClasses.Reflexive Logic.eq”,而预期的类型为“1 = 1”。
nostutter.v 的标头:
Set Warnings "-notation-overridden,-parsing".
Require Import List.
Import ListNotations.
Require Import PeanoNat.
Import Nat.
Local Open Scope nat_scope.
我必须明确添加一个参数eq_refl
:specialize (H2 (eq_refl 1)).
我认为这与专业无关。它是什么?怎么修?