簡體   English   中英

兩個命題之間的相等性 nat -> nat

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM