[英]Equality between two propositions nat -> nat
我目前正在 coq 的一個項目中工作,我需要使用nat -> nat
列表。 所以基本上我會有一個定義,它接受一個list (nat -> nat)
和一個命題f: nat -> nat
作為參數,目標是檢索給定列表中f
的索引。
我所做的是我實現了一個通過列表的固定點,並將每個元素與f
與相等=
進行比較。 但是我發現這是不正確的,並且此類類型的相等性是無法確定的。
有誰知道解決這個問題的替代方法? 或者更簡單的方法來檢索列表中f
的索引?
我不確定您為什么將f: nat -> nat
稱為命題而不是 function 但無論如何,除非您對l
的內容有更多假設,否則我認為您的問題沒有解決方案。
正如您所指出的,功能的平等通常是不可判定的。 您只能對它們執行有限數量的觀察(例如調用f 0
並檢查結果)。 如果您知道您的功能足夠不同,那么檢查它們是否同意一些(精心選擇的)特定值可能就足夠了,否則我看不到出路。
也許是您過度簡化了手頭的問題/任務,而您遇到的真正問題確實有解決方案。 目前,該問題與 Coq 無關。
作為記錄,如果一般問題無法確定(正如 Théo 解釋的那樣),您似乎不太可能真的想要/需要這個。 但是,為了回答這個問題:
如果您確定您的輸入列表恰好出現了一次您正在尋找的 function f
(其中函數由它們的逐點相等標識),那么列表中的所有其他函數在某些時候與f
不一致。 換句話說,對於每個其他函數,都存在一個k: nat
使得gk ≠ fk
。
由於nat
是可枚舉的,integer 比較是可判定的,並且列表是有限的,因此有一個終止算法來解決這個問題。 在命令式偽代碼中:
input: a function f : nat → nat
input: a list of functions [ g[0] ; g[1] ; … ; g[n−1] ] : list (nat → nat)
start:
is_candidate := [ true ; true ; … ; true ] (array of length n)
candidate_count := n
k := 0
while true do:
if candidate_count < 2 then:
return the only index i such that is_candidate[i] == true
for all i in [0; n) do:
if is_candidate[i] == true and f k ≠ g[i] k then:
is_candidate[i] := false
candidate_count := candidate_count − 1
k := k+1
end
如果列表中有多次出現f
,則算法永遠不會終止(這些出現永遠是候選者)。 如果出現 0 次或 1 次,則算法終止,但無法確定剩余候選者是否完全等於f
。
因此,上述假設對於終止和糾正是必要的。 這在 Coq 中可能不容易實現,尤其是因為您必須說服 Coq 終止。 祝你好運,如果這真的是你想要的。 ;-)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.