Я только начинаю с Agda и следую учебному пособию LearnYouAnAgda , в котором мне показали это удостоверение личности:
proof : (A : Set) → A → A
proof _ x = x
Из того, что я понимаю, _
необходимо пропустить параметр (A : Set)
. Я хотел использовать неявный параметр, чтобы пропустить _
:
-- using implicit parameter
proof' : {A : Set} → A → A
proof' x = x
Это доказательство работает. Затем я хотел применить его к конкретному случаю, как это делается в учебнике. Я определяю ℕ
и даю подпись типа для того, что я хочу доказать:
data ℕ : Set where
zero : ℕ
suc : ℕ → ℕ
idProof : ℕ → ℕ
Конструктор, приведенный в руководстве с использованием proof
:
idProof = proof ℕ
Я не совсем понимаю это, так как ожидал, что proof
потребуется 2 параметра, учитывая конструктор, который мы уже определили.
Я хотел написать конструктор, используя proof'
, но обнаружил, что ничего из следующего не работает:
idProof = proof' ℕ
idProof = {x : ℕ} → proof' x
idProof = {x : Set} → proof' x
Используя солвер, я нашел, что это сработало:
idProof = proof' (λ z → z)
Мои вопросы:
В чем различия между proof
и proof'
?
Почему допустимо использовать один параметр, ℕ
, для proof
?
Почему три конструктора, использующие proof'
, не работают?
Бонус:
Небольшое объяснение того, как работает idProof = proof' (λ z → z)
(особенно лямбда), будет оценено, если только оно, вероятно, не будет соответствовать моему нынешнему уровню понимания Агды.