Как написать булеву функцию сравнения в Coq - PullRequest
1 голос
/ 11 января 2020

Я пытаюсь удалить все целые числа, которые больше 7, из списка следующим образом

filter (fun n => n > 7).

Однако я получаю следующую ошибку

The term "n > 7" has type "Prop" while it is expected to have type "bool".

Я новичок в Coq как это исправить?

1 Ответ

3 голосов
/ 11 января 2020

Проблема в том, что @List.filter nat ожидает функцию типа nat -> bool, но вы предоставили функцию типа nat -> Prop. Здесь @List.filter nat - это List.filter, примененное к аргументу типа nat. Одно из различий между bool и Prop состоит в том, что bool разрешимо, а Prop нет: существуют предложения P, такие, что ни P, ни ~P не известны; всегда можно определить, является ли что-то true или false.

Чтобы разрешить эту ситуацию, вам нужно написать функцию типа nat -> bool, которая возвращает true при применении к аргументу чем 7 и false в противном случае. Вы можете воспользоваться тем, что стандартная библиотека определяет логические функции сравнения над натуральными числами. Я бы также предложил прочитать первый том Software Foundations , чтобы ознакомиться с Coq. Он более доступен и легок в обращении, чем некоторые другие выдающиеся введения (он использовался в курсе проверки программ в моем университете, который предполагал небольшой опыт функционального программирования).

Вот минимальный пример, использующий только встроенный тип списка и обозначения:

Require Import Coq.Lists.List.
Import ListNotations. 

Fixpoint filterb {A : Type} (f : A -> bool) (xs : list A) : list A :=
  match xs with
  | []      => []
  | x :: xs => if f x then x :: filterb f xs else filterb f xs
  end. 

Fixpoint ltb (n m : nat) : bool :=
  match n, m with
  | n  , 0   => false
  | 0  , S m => true
  | S n, S m => ltb n m
  end.

Eval compute in (filterb (fun n => ltb 7 n) [5;6;7;8;9]).
(* = [8;9] *)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...