繁体   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