我正在嘗試編寫一個函數,該函數將自然數列表作爲輸出並返回其中不同元素的數量。例如,如果我有列表[1,2,2,4,1],我的函數DifElem應輸出「3」。我試過很多東西,我已經得到最接近的是這樣的:在Coq中計算列表中不同元素的數量
Fixpoint DifElem (l : list nat) : nat :=
match l with
| [] => 0
| m::tm =>
let n := listWidth tm in
if (~ In m tm) then S n else n
end.
我的邏輯是這樣的:如果m不在列表中的尾部,然後添加一個櫃檯。如果是這樣,不要添加到櫃檯,所以我只會計算一次:當它是最後一次出現時。我得到的錯誤:
Error: The term "~ In m tm" has type "Prop"
which is not a (co-)inductive type.
在爲它定義那裏勒柯克的名單標準庫Coq.Lists.List.
的一部分:
Fixpoint In (a:A) (l:list A) : Prop :=
match l with
| [] => False
| b :: m => b = a \/ In a m
end.
我想我不明白不夠好怎麼用。如果再聲明定義,Coq的文檔沒有足夠的幫助。
我也試過這個定義與nodup
來自同一庫:
Definition Width (A : list nat) := length (nodup (A)).
在這種情況下,我所得到的錯誤是:
The term "A" has type "list nat" while it is expected to have
type "forall x y : ?A0, {x = y} + {x <> y}".
而且我安靜困惑,這是怎麼回事在這。我希望你能幫助解決這個問題。
謝謝你,我其實無所適從勒柯克可採取的「如果......那麼......」的語句。它可以採取布爾人。只有2個構造函數可以使用任何歸納定義嗎?或者有什麼限制?非常感謝您的建議。源代碼和如何修復我的代碼都非常有幫助! – Sara
是的,'if'語句將任何兩個構造函數類型視爲布爾值。第一個構造函數被視爲true。更多關於這方面的內容,你可以在Adam Chlipala的[CPDT](http://adam.chlipala.net/cpdt/)書中找到([here](http://adam.chlipala.net/cpdt/html/MoreDep.html) )。 –
僅供參考,SF的'MoreLogic'章節已經從更新版本的SF中刪除:(我不確定在哪裏可以找到不包含解決方案的鏡像 –