找到了一个归纳类型 bool 的构造函数,而期望是一个列表的构造函数

Found a constructor of inductive type bool while a constructor of list is expected

我有以下问题:定义函数值:list bool -> nat return 由布尔值列表(二进制数到十进制数)表示的值。例如,值 [false;true;false;true] = 10。 我写了这个:

Fixpoint value (l: list bool) := match l with
|true=> 1
|false=> 0
|x::r => (value [x])+2*(value r)
end.

但我收到此错误:“找到了归纳类型 bool 的构造函数 而列表的构造函数 是预期的。

我尝试将 false 和 true 作为布尔列表:[false] [true] 但是还是不行。。。怎么办?

事实上,Coq 理所当然地抱怨你应该为列表使用构造函数,并且 truefalse 是布尔值,而不是布尔值列表。你是对的,应该使用 [true][false]

那么在这之后,Coq 应该仍然抱怨你没有在空列表上指定你的函数,所以你需要像这样为它添加一个 case:

Fixpoint value (l: list bool) :=
  match l with
  | [] => 0
  | [ true ] => 1
  | [ false ] => 0
  | x :: r => value [x] + 2 * value r
  end.

这次 Coq 仍然会报错,但有另一个原因:它不知道 [x] 小于 x :: r。因为语法上不是这样的。 要修复它,我建议简单地处理这两种情况:truefalse。这在任何情况下都会产生更简单的东西:

From Coq Require Import List.
Import ListNotations.

Fixpoint value (l: list bool) :=
  match l with
  | [] => 0
  | true :: r => 1 + 2 * value r
  | false :: r => 2 * value r
  end.