Лемма как тип записи

Новичок здесь! Как мне интерпретировать запись, которая выглядит примерно так?

 Record test A B :=
{
  CA: forall m, A m; 
  CB: forall a b m, CA m ==> B(a,b);
}

Я пытаюсь понять, как будет выглядеть экземпляр этой записи и, более того, что значит иметь квантифицированную лемму в качестве типа.

Какие бывают типы A и B?

Arthur Azevedo De Amorim 08.04.2019 01:46

Я предполагаю, что A — унарный предикат, а B — бинарный предикат. Будет ли смысл этой записи отличаться в зависимости от того, какие фактические типы я им присваиваю?

aupreti 08.04.2019 04:26
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

То, что вы пишете, не имеет смысла, потому что обозначение _ ==> _ должно связывать два логических значения. Но CA имеет тип A m, который сам по себе является типом, а не логическим значением.

Одной из возможностей продвижения вперед было бы создание логической функции CA, которая могла бы представлять предикат A.

Еще одна трудность с вашей гипотетической записью заключается в том, что мы не знаем, каковы типы ввода для A и B, поэтому я предполагаю, что мы живем в окружающем типе T, по которому появляются количественные оценки. Итак, вот вариант:

Record test (T : Type) (A : T -> Prop) (B : T * T -> bool) :=
{
  CA : T -> bool;
  CA_A : forall m, CA m = true -> A m;
  CB : forall a b m, (CA m ==> B(a, b)) = true
}.

Этот пример заставляет вас понять, что в этом логическом языке есть два разных понятия: bool значения и Prop значения. Они представляют разные вещи, которые иногда могут быть объединены, но вам нужно четко уяснить различие в своей голове, чтобы выйти из категории новичок.

Для вашего последнего предложения «что значит иметь квантифицированную лемму как тип» здесь есть другое объяснение.

При программировании на обычном языке программирования вы можете возвращать массивы целых чисел. Однако вы не можете быть явным и сказать, что вы хотите вернуть массив целых чисел конкретная длина. В Gallina (базовый язык программирования Coq) можно определить тип массивов длины 10. Предположим, что такой тип будет записан array n. Таким образом, array 10 и array 11 будут двумя разными типами. Функция, которая принимает на вход число n и возвращает на выходе массив длины n, будет иметь следующий тип:

forall n, array n

Таким образом, объект, тип которого имеет количественную формулу, просто является функцией.

С логической точки зрения утверждение forall n, array n обычно читается как для каждого n существует массив size n. Это утверждение, вероятно, не стало для вас сюрпризом.

Таким образом, тип массива зависит от индекса. Теперь мы можем подумать о другом типе, например, тип доказательства того, что n простое число. Предположим, что этот тип пишется prime n. Конечно, есть числа, которые не являются простыми, поэтому, например, тип prime 4 вообще не должен содержать никакого доказательства. Теперь я могу написать функцию с именем test_prime : nat -> bool со свойством, что когда она возвращает true, у меня есть гарантия, что ввод является простым. Это будет написано так:

forall n, test_prime n = true -> prime n

Теперь, если я хочу определить набор всех правильных простых функций тестирования, я хотел бы связать в одном фрагменте данных функцию и доказательство ее правильности, поэтому я бы определил следующий тип данных.

Record certified_prime_test :=
  {
     test_prime : nat -> bool;
     certificate : forall n, test_prime n = true -> prime nat
  }.

Таким образом, записи, содержащие универсальные квантифицированные формулы, могут относиться к одной из этих двух категорий: либо один компонент является одной из этих функций, выходные данные которой различаются для нескольких типов одного и того же семейства (как в примере array), либо один из компонентов на самом деле приносит больше логическая информация о другом компоненте, который является функцией. В примере certified_prime_test компонент certificate содержит больше информации о функции test_prime.

Это проясняет большую часть моего замешательства. Я пытался воссоздать запись, которую видел в своем тестовом примере. Закончилось заменой -> на ==>, а также путаницей с bools и props. Спасибо за это подробное объяснение.

aupreti 09.04.2019 16:11

@Yves Есть небольшая опечатка, из-за которой первый абзац о простых числах довольно нечитаем (путаница между * и `). Не могли бы вы исправить это?

eponier 10.04.2019 16:03

Другие вопросы по теме