我试图在列表中搜索一个对象,然后如果找到它可能返回true;否则就是假的。
然而,我试图提出的是不正确的。我真的很感激一些指导。我需要通过比较列表的头部和相关元素来搜索元素列表的函数,如果不匹配,则递归地将列表的其余部分通过函数并通过匹配列表的头部重复。
Fixpoint find (li:list Interface){struct li}: list Interface :=
match li with
| nil => nil
| y::rest => find rest
end.
非常感谢您的指导和帮助。
提前谢谢
答案 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定义Interface
,Leibniz 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)