2013-04-05 3 views
0

Предположим, что мне нужно, чтобы доказать что-то вроде следующего:Простой способ упростить выражение в анонимной функции?

x: nat 

(fun _ : nat => 0) = (fun y : nat => if beq_nat x y then 0 else 0) 

Поскольку y не в окружающей среде, это выглядит как я не могу уничтожить на beq_nat x y упростить правую часть. Есть ли простой способ упростить выражения в анонимной функции?

Помимо возможности массировать две функции, чтобы выглядеть одинаково, существует ли способ вывести, что две функции одинаковы, показывая, что они производят одинаковое значение на всех входах?

EDIT: Я понимаю, что я могу просить о невозможности, поскольку эти функции не совпадают, просто при применении к аргументу они дают одинаковое значение. Я не уверен, как именно это интерпретирует Coq.

ответ

1

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

Вы не можете доказать это непосредственно в Coq (с = является definitioinal равенство, это не так), но если вы хотите, вы можете требовать этого модуля:

http://coq.inria.fr/stdlib/Coq.Logic.FunctionalExtensionality.html

, который предоставит вам с аксиомами для функциональной растяжимости. Вы можете позвонить по тактике extensionality y., которая предоставит вам доступ к y.

+0

Да, это похоже на то, что происходит. Предполагая, что в моем случае аксиома не является проблемой, так как нет других вспомогательных аксиом. –

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