WedX - журнал о программировании и компьютерных науках

Почему я не могу использовать `app` вместе с `fold_right` в Coq?

Я получаю ошибку типа в последней строке следующей программы:

Require Import List.
Import ListNotations.

(* This computes to 10 *)
Compute (fold_right plus 0 [1;2;3;4]).

(* I want this to compute to [5;6;7;8] but it gives a type error instead *)
Compute (fold_right app [] [[5;6]; [7;8]]).

Это ошибка, которую я получаю:

Error:
The term "app" has type "forall A : Type, list A -> list A -> list A" while it is expected to have type
 "Type -> ?A -> ?A" (cannot instantiate "?A" because "A" is not in its scope).

Я действительно не понимаю, почему я получаю эту ошибку. Чем здесь отличаются app и plus? Связано ли это с тем, что app полиморфна, а plus является мономорфной nat -> nat -> nat функцией?

Если это имеет значение, моя версия Coq — 8.5.

coq
06.10.2016

  • Я попытался привести несколько примеров такого поведения в своем ответе здесь. ХТН. 06.10.2016

Ответы:


1

Вы правильно догадались: это как-то связано с полиморфностью app. Проблема в том, что Coq позволяет по-разному выводить неявные аргументы в зависимости от того, применяется ли соответствующий термин к аргументам или нет. Точнее, немаксимальные имплициты вставляются только тогда, когда термин применяется к чему-то, но не вставляется, если термин используется сам по себе, например, ваш app. Есть два способа исправить ситуацию:

1- Заставить Coq вывести что-то для этого экземпляра, как в fold_right (@app _) [] [[5; 6]; [7; 8]].

2- Используйте глобальное объявление, которое максимально вставит аргумент типа: Arguments app {_} _ _.. Дополнительные сведения о том, что это делает, см. в справочном руководстве.

06.10.2016
  • Спасибо. Это прекрасно отвечает на мой вопрос. 06.10.2016
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]