coq中的链接定义

coq中的链接定义,coq,Coq,我正在阅读与Coq合作的书籍。我现在在战术章节,我被困在了 我想使用negb来否定test谓词,但我收到了错误术语“test”的类型为“X->bool”,而预期它的类型为“bool”。 我希望我能够以某种方式否定一个谓词,但我似乎不太明白怎么做。正如错误消息所说,negb需要一个布尔值,而不是一个完整的谓词。使用negb生成新谓词的最简单方法是funx=>negb(testx)。请注意,现在(测试x)实际上具有类型bool,因此可以将其馈送到negb 或者,您可以为函数组合创建一个符号(我认为标

我正在阅读与Coq合作的书籍。我现在在战术章节,我被困在了

我想使用
negb
来否定
test
谓词,但我收到了错误
术语“test”的类型为“X->bool”,而预期它的类型为“bool”。


我希望我能够以某种方式否定一个谓词,但我似乎不太明白怎么做。

正如错误消息所说,
negb
需要一个布尔值,而不是一个完整的谓词。使用
negb
生成新谓词的最简单方法是
funx=>negb(testx)
。请注意,现在
(测试x)
实际上具有类型
bool
,因此可以将其馈送到
negb

或者,您可以为函数组合创建一个符号(我认为标准库中不存在这样的符号,尽管我不知道软件基础)。例如,
符号“f'o'g”:=(funx=>f(gx))(在级别20)。
(您可能需要更改级别以避免与现有符号冲突)。然后您就可以进行
negb-o测试


第三种解决方案是,如果您希望经常对谓词求反,而不想使用函数组合表示法,那么可以创建一个对布尔谓词求反的新函数,而不是对布尔谓词求反。例如,
定义neg_pred{X:Type}(pred:X->bool:X->bool:=funx=>negb(pred X)。
。然后您可以简单地使用
neg_pred test

,正如错误消息所说,
negb
需要一个布尔值,而不是一个完整的谓词。使用
negb
生成新谓词的最简单方法是
funx=>negb(testx)
。请注意,现在
(测试x)
实际上具有类型
bool
,因此可以将其馈送到
negb

或者,您可以为函数组合创建一个符号(我认为标准库中不存在这样的符号,尽管我不知道软件基础)。例如,
符号“f'o'g”:=(funx=>f(gx))(在级别20)。
(您可能需要更改级别以避免与现有符号冲突)。然后您就可以进行
negb-o测试

第三种解决方案是,如果您希望经常对谓词求反,而不想使用函数组合表示法,那么可以创建一个对布尔谓词求反的新函数,而不是对布尔谓词求反。例如,
定义neg_pred{X:Type}(pred:X->bool:X->bool:=funx=>negb(pred X)。
。然后您可以简单地使用
neg\u pred test

Fixpoint forallb {X : Type} (test : X -> bool) (l : list X) : bool :=
  match l with
  | [] => true
  | h :: t => test h && forallb test t
  end.

Example test_forallb_1 : forallb oddb [1;3;5;7;9] = true.
Proof. simpl. reflexivity. Qed.

Example test_forallb_2 : forallb negb [false;false] = true.
Proof. simpl. reflexivity. Qed.

Example test_forallb_3 : forallb evenb [0;2;4;5] = false.
Proof. simpl. reflexivity. Qed.

Example test_forallb_4 : forallb (eqb 5) [] = true.
Proof. simpl. reflexivity. Qed.

Fixpoint existsb {X : Type} (test : X -> bool) (l : list X) : bool :=
  match l with
  | [] => false
  | h :: t => test h || forallb test t
  end.


Example test_existsb_1 : existsb (eqb 5) [0;2;3;6] = false.
Proof. simpl. reflexivity. Qed.

Example test_existsb_2 : existsb (andb true) [true;true;false] = true.
Proof. simpl. reflexivity. Qed.

Example test_existsb_3 : existsb oddb [1;0;0;0;0;3] = true.
Proof. simpl. reflexivity. Qed.

Example test_existsb_4 : existsb evenb [] = false.
Proof. simpl. reflexivity. Qed.

Definition existsb' {X : Type} (test : X -> bool) (l : list X) : bool :=
  negb (forallb (negb test) l).

Example test_existsb_1' : existsb' (eqb 5) [0;2;3;6] = false.
Proof. simpl. reflexivity. Qed.

Theorem existsb_existsb' : forall (X : Type) (test : X -> bool) (l : list X),
  existsb test l = existsb' test l.
Proof. (* FILL IN HERE *) Admitted.