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