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