2017-01-28 1 views
7

Используя язык, похожий на Morte/CoC, я пытаюсь доказать простое заявление there are lists of arbitrary lengths. Для этого я написал следующий вид:Обычно ли обертывать переменную в бесполезный вызов `id`, чтобы избежать проблем с преобразованием eta на доказательствах?

∀ n:Nat -> 
(ThereIs (List Nat) 
    (Equal Nat 
    (List.length Nat l) 
    n))) 

ThereIs является зависимой пара (Sigma). Все закодировано в церкви. Чтобы доказать это, я написал следующее доказательство:

λ n:Nat -> 
(ThereIs.this (List Nat) 
    (λ l:(List Nat) -> (Equal Nat (List.length Nat l) n)) 
    (List.replicate Nat n Nat.Zero) 
    (Equal.refl Nat n)) 

Жутко, я получаю ошибку несоответствия типов между d (т.е. свободным переменным типом Nat) и λ c:* -> λ b:(c -> c) -> λ a:c -> (d c b a). Но этот более поздний термин, когда eta-reduced, равен d! Так как я не имею ETA-редуктор готов, вместо этого я сделал эту следующую функцию «бесполезной идентифицировать»:

λ n: Nat -> 

λ Nat:* -> 
λ Succ: (Nat -> Nat) -> 
λ Zero: Nat -> 

(n Nat Succ Zero) 

Теперь, применяя этот бесполезный идентификатор для каждого вхождения n, я «не-эта» это , в результате чего доказательство проверяется. Я хотел бы получить представление о том, что здесь происходит. Является ли эта «бесполезная функция id» известной/используемой моделью при написании доказательств? Почему не может быть исчисление конструкций, способное набрать это доказательство без этой небольшой помощи? Есть ли какие-либо глубокие аргументы в пользу этого явления или это просто то, что происходит по какой-то особой причине?

+1

Вы имеете в виду eta не альфа, не так ли? –

+0

Да, извините @ReidBarton – MaiaVictor

+2

Я думаю, что специально разработанные 'идентификаторы всех разновидностей - не только эти равенства - очень распространены в системах доказательств. Половина тактик в Coq заканчивается переводом на 'id', написанным особенно захватывающим образом. –

ответ

4

Вам необходимо добавить eta в ваш алгоритм проверки конверсий. Это может быть сделано несколько способов, самые простые два

  • типа направлена ​​как на странице 22 Ulf Norell's thesis и используются в Agda
  • Нетипизированные, используемые в Coq AFAIK

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

Сначала мы проверяем случай, когда оба значения являются лямбдами, как обычно. Однако после этого мы проверяем два дополнительных случая, когда только одна сторона лямбда. В этих случаях мы применяем тело лямбды к новой общей переменной (как обычно), а также применяем другой термин к одной и той же переменной и проверяем равенство полученных значений.

Вот и все! Это на самом деле очень просто и не имеет большой производительности. Обратите внимание, что нам не нужно реализовывать eta-сокращение или сильную нормализацию eta, так как эта проверка преобразования легко выполняется по нормальным значениям слабой головки на лету.

+1

«Типированное преобразование этама действительно необходимо для этапов преобразования типов единиц» - любых нерелевантных предложений, которые могут состоять из 'Bot',' _-> _ ',' Sigma', пропозиционального усечения и даже пользовательских 'data' (в отличие от' record'), например вы можете иметь систему, в которой вы можете доказать, что 'Vec A n' является' Prop', если 'A' является' Prop' (который работает, потому что форма контейнера 'Vec A n'' 'Top', т.е. статически известно, поэтому есть возможности для дальнейшего обобщения (любой контейнер с пропозициональной формой и позициями, я думаю?)) и воссоединяют унификацию с этими знаниями. – user3237465

+0

@ user3237465 - это расширенные функции даже в контексте современного dep. языки, поэтому я подумал, что они не в тему. Мне кажется, интересна также идентификация 'Prop

+0

@ user3237465 Кроме того, я думаю, что пропозициональное усечение находится в другой лиге. Унификация традиционно решает уравнения только до определения равенства, что является доказательством несущественности, но если мы рассматриваем более высокие конструкторы как решения, нам нужна доказательная соответствующая унификация. В Agda правильное '-without-K' для унификации в шаблонах было довольно [сложным прыжком] (https://people.cs.kuleuven.be/~jesper.cockx/unifiers-as-equivalences/draft.pdf) , и я думаю, что было бы нелегко объединиться по правым сторонам/имплицитам. –

Смежные вопросы