Rcoq模拟题


Rcoq模拟题

组1

一、 系统指令

Q1. 在 Rocq 中,命令 Check (negb true). 的主要作用是?
A. 计算出该表达式的结果为 false
B. 查看该表达式的类型,结果显示为 bool
C. 检查 negb 这个函数是否存在于当前库中。
D. 打印出 negb 函数的源代码。

答案:B。解析:Check 只看类型,不求值。

Q2. 若要将表达式 1 + 2 彻底简化并输出结果 3,应使用的语句是?
A. Check 1 + 2.
B. Compute 1 + 2.
C. Locate 1 + 2.
D. Print 1 + 2.

答案:B。解析:Compute 是计算(归约)求值的指令。

Q3. 命令 Search (0 + _ = _). 的作用是?
A. 定义一个名为 Search 的加法函数。
B. 寻找当前库中所有符合“0加某数等于某数”模式的定理。
C. 检查 0 是否属于自然数集合。
D. 彻底化简目标中的加法运算。

答案:B。解析:Search 用于搜索库中已有的定理。


二、 关键字定义

Q4. 下列关于关键字 Inductive 的描述,哪项是最准确的?
A. 它是用来定义递归函数,必须保证能够终止。
B. 它是用来定义归纳数据类型(如枚举、链表等),并给出其构造器。
C. 它是用来声明一个局部的逻辑假设,只在 Section 内有效。
D. 它是用来将目标中的一个符号替换为另一个符号。

答案:B。解析:Inductive 用于定义数据类型及其构造器(Constructor)。

Q5. 语句 Fixpoint factorial (n:nat) := ... 相比于 Definition,其特殊之处在于?
A. 它定义的函数是全局可见的。
B. 它定义的函数允许进行自我调用(递归)。
C. 它定义的函数只能处理布尔值。
D. 它定义的函数必须返回一个 Prop 类型的值。

答案:B。解析:Fixpoint 专门用于定义递归。

Q6. 在 Section 内部使用 Variable n : nat. 声明的变量,其特点是?
A. 它是全局公理,在所有文件中都生效。
B. 它是一个递归函数。
C. 它的作用域仅限于当前的 Section 块,离开后即失效。
D. 它是 Notation 的另一种写法。

答案:C。解析:Variable 是局部声明。


三、 证明策略

Q7. 当目标 (Goal) 是 forall b : bool, b = negb (negb b) 时,最合适的起始策略是?
A. reflexivity.
B. simpl.
C. intros b.
D. split.

答案:C。解析:目标有 forall,先用 intros

Q8. 紧接上题,当假设区有了 b : bool,目标是 b = negb (negb b),下一步该做什么?
A. reflexivity. (因为此时还没化简,两边不相等)
B. destruct b. (因为 b 是布尔值,需要分 true/false 两种情况讨论)
C. apply b. (b 只是个变量,不是定理)
D. rewrite b.

答案:B。解析:对于归纳类型变量(nat/bool),常用 destruct 分类讨论。

Q9. 策略 simpl. 在证明过程中的主要作用是?
A. 引入一个新的前提条件。
B. 执行定义好的函数逻辑进行化简(如展开 match 和递归)。
C. 证明左右两边完全相等的等式。
D. 撤销上一步操作。

答案:B。解析:simpl 就是简化目标。

Q10. 如果目标是 A /\ B(合取命题),你应该使用哪个策略?
A. left.
B. right.
C. split.
D. exists.

答案:C。解析:split 拆分“且”;left/right 用于“或” (\/)。

Q11. 语句 rewrite <- H. 的含义是?
A. 将目标中所有出现的 H 的右端项替换为左端项。
B. 将假设 H 从上下文中删掉。
C. 证明目标 H 与当前假设一致。
D. 声明 H 是一个递归定义的函数。

答案:A。解析:<- 代表从右往左替换。


四、 核心理论

Q12. 在 Rocq 的归约规则中,处理“函数应用(将参数带入函数体)”的规则名称是?
A. $\delta$ (delta) 归约
B. $\beta$ (beta) 归约
C. $\iota$ (iota) 归约
D. $\zeta$ (zeta) 归约

答案:B。解析:Beta 归约是最基础的函数调用归约。

Q13. 关于 PropSet 的区别,下列说法正确的是?
A. Prop 用于描述数据类型,Set 用于描述逻辑命题。
B. Prop 用于逻辑证明,Set 用于程序和数据。
C. 两者完全相同,只是名字不一样。
D. Set 里的东西不能通过 Check 查看。

答案:B。解析:Prop 是逻辑世界,Set 是计算世界。

Q14. 依据 Curry-Howard 同构,一个“证明项”对应于程序设计中的?
A. 变量名
B. 一个程序(Lambda 项/函数体)
C. 编译器错误信息
D. 程序的注释

答案:B。解析:证明即程序,命题即类型。


五、 语句辨析

Q15. 语句 Lemma test : forall n, n + 0 = n. Proof. intros. auto. Qed.Qed. 的作用是?
A. 标志证明的开始。
B. 暂时跳过该证明,标记为黄色。
C. 标志证明的圆满结束,并验证证明项的正确性,将其存入环境。
D. 定义一个名为 Qed 的函数。

答案:C。解析:Qed 是 Proof 结束的标志。

组2

一、 命令与输出

Q1:执行语句 Check (plus 1 1). 系统会输出什么?
A. 2 : nat
B. plus 1 1 : nat
C. nat : Prop
D. plus 1 1 : Prop

答案:B。解析:Check 只看类型(nat),不进行计算,所以不会变成 2。

Q2:如果你想在 Rocq 中看到函数 negb 的具体逻辑(源代码),你应该使用哪条语句?
A. Check negb.
B. Compute negb.
C. Print negb.
D. Search negb.

答案:C。解析:Print 用于打印定义的源码。


二、 关键字含义

Q3:语句 Fixpoint mult (n m : nat) : nat := ... 的含义是?
A. 定义一个名为 mult 的全局常量。
B. 声明一个名为 mult 的逻辑公理。
C. 定义一个名为 mult 的递归函数。
D. 定义一个名为 mult 的归纳数据类型。

答案:C。解析:Fixpoint 是递归函数的专属关键字。

Q4:语句 Inductive bool : Set := true | false. 的含义是?
A. 定义一个递归函数 bool,包含两个参数。
B. 定义一个名为 bool 的归纳数据类型,它有两个构造器。
C. 证明 bool 是一个命题,其值为 true 或 false。
D. 声明一个全局变量 bool,初始值为 true。

答案:B。解析:Inductive 用于定义类型,“|”分隔的是它的构造器。

Q5:语句 Notation "x + y" := (plus x y). 的意思是?
A. 强制将所有 x 替换为 y。
B. 定义加号为 plus 函数的简写(记法)。
C. 证明 x+y 等于 plus x y。
D. 声明一个名为 Notation 的函数。

答案:B。解析:Notation 就是给已有的定义起一个好听的符号名(语法糖)。


三、 证明策略选择

Q6:当前目标 (Goal) 是 forall x y : nat, x + y = y + x,第一步操作最合适的是?
A. reflexivity.
B. simpl.
C. rewrite.
D. intros x y.

答案:D。解析:看到 forall->,最基本的起手式就是 intros

Q7:当前目标 (Goal) 是 S (S O) = 2,此时执行哪条指令能直接完成证明?
A. intros.
B. destruct.
C. reflexivity.
D. split.

答案:C。解析:S (S O) 内部就是 2,左右相等,用自反性 reflexivity

Q8:假设区有 H: x = y,目标是 x + 1 = y + 1,应使用哪条指令?
A. apply H.
B. rewrite H.
C. destruct H.
D. simpl H.

答案:B。解析:利用已知等式进行替换,用 rewrite


四、 综合

Q9:关于语句 Admitted. 的说法正确的是?
A. 它表示证明已经完美结束,可以保存。
B. 它表示放弃当前证明,系统会假设该命题成立并允许继续。
C. 它会执行所有的计算并将结果存入内存。
D. 它必须出现在 Inductive 定义的结尾。

答案:B。解析:Admitted 是“承认、承认”的意思,即跳过证明(黄色标记)。

Q10:在语句 rewrite <- H. 中,符号 <- 的含义是?
A. 将目标中与 H 结论相反的部分删掉。
B. 利用等式 H,将目标中的右边部分替换为左边部分。
C. 利用等式 H,将目标中的左边部分替换为右边部分。
D. 表示 H 是一个递归定义的假设。

答案:B。解析:默认 rewrite H 是左换右,加了 <- 就是右换左。

  • 指令类:求值选 Compute,求类型选 Check,看源码选 Print
  • 关键字类:递归选 Fixpoint,定义类型选 Inductive,普通定义选 Definition
  • 策略类
    • 看到 forall / -> $\rightarrow$ intros
    • 看到 bool / nat 变量 $\rightarrow$ destruct
    • 看到等式替换 $\rightarrow$ rewrite
    • 最后一步(左右相等)$\rightarrow$ reflexivity
    • 目标是 A /\ B $\rightarrow$ split
  • 逻辑类:全称量词是 forall,存在量词是 exists

👉 点击这里阅读下一篇:《Rocq知识点》


Author: linda1729
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source linda1729 !
评论
  TOC