Как говорится в сообщении об ошибке, negb
ожидает один логический тип, а не целый предикат. Самый простой способ создать новый предикат с использованием negb
- это что-то вроде fun x => negb (test x)
. Обратите внимание, что теперь (test x)
на самом деле имеет тип bool
, поэтому он может быть передан в negb
.
В качестве альтернативы, вы можете сделать запись для композиции функции (я не думаю, что такая запись существует встандартная библиотека, хотя я не знаю об основах программного обеспечения). Например, Notation "f 'o' g" := (fun x => f (g x)) (at level 20).
(вам может потребоваться изменить уровень, чтобы избежать конфликтов с существующими обозначениями). Тогда вы сможете сделать negb o test
.
Третье решение, если вы ожидаете много отрицать предикаты и не хотите заходить так далеко, как запись композиции функций, было бы сделатьновая функция, которая отрицает логический предикат вместо отрицательного логического. Например, Definition neg_pred {X: Type} (pred: X -> bool): X -> bool := fun x => negb (pred x).
. Тогда вы можете просто использовать neg_pred test
.