在Coq中递归搜索列表

时间:2011-07-09 16:51:25

标签: list coq theorem-proving

我试图在列表中搜索一个对象,然后如果找到它可能返回true;否则就是假的。

然而,我试图提出的是不正确的。我真的很感激一些指导。我需要通过比较列表的头部和相关元素来搜索元素列表的函数,如果不匹配,则递归地将列表的其余部分通过函数并通过匹配列表的头部重复。

Fixpoint find (li:list Interface){struct li}: list Interface :=
match li with
| nil => nil
| y::rest => find rest 
end.

非常感谢您的指导和帮助。

提前谢谢

2 个答案:

答案 0 :(得分:3)

标准库中的List理论中有一个非常相似的函数。该函数将谓词作为参数,即从元素类型到f的函数bool,如果找到匹配的元素Some x则返回x,或{ {1}}如果找不到。

None

您正在寻找与特定对象Variable A : Type. Fixpoint find (f:A->bool) (l:list A) : option A := match l with | nil => None | x :: tl => if f x then Some x else find tl end. 相等的元素。这意味着您的谓词为a,其中eq_Interface a是您想要的eq_Interface上的相等。

由您定义类型上的相等函数,因为可以有许多相等的定义。 Coq定义InterfaceLeibniz equality:如果没有办法区分它们,则两个值相等。 =是一个命题,而不是一个布尔值,因为这个属性通常不是可判定的。它并不总是一个类型上的理想等式,有时你想要一个更粗略的等价关系,这样如果两个对象以不同的方式构造但是具有相同的含义,则可以认为它们是相等的。

如果=是一个简单的数据类型 - 直观地说,一个没有嵌入命题的数据结构 - 有一个内置的策略来从类型定义构建结构相等函数。在参考手册中查找Interface

decide equality

Definition Interface_dec : forall x y : Interface, {x=y} + {x <> y}. Proof. decide equality. Defined. Definition Interface_eq x y := if Interface_dec x y then true else false. 不仅会告诉你它的论点是否相等,而且还会证明参数是相等的,或者它们是不同的。

一旦拥有了这个相等功能,就可以根据标准库函数定义Interface_dec函数:

find

答案 1 :(得分:-1)

嗯,我不会通过提供工作代码来破坏乐趣:)。你显然缺少一些东西。您是如何在Coq中编码它的问题还是更一般?你会怎么用伪代码写它?或者您熟悉的其他语言?