如何检查两个FStar.Set的相等性

时间:2019-11-18 17:25:30

标签: functional-programming formal-verification fstar

如何检查FStar中的两个集合是否相等?以下表达式的类型为Type0而不是Tot Prims.bool,因此我不确定如何使用它来确定集合是否相等(例如在条件条件下)。是否应该使用其他功能代替Set.equal

Set.equal (Set.as_set [1; 2; 3]) Set.empty

1 个答案:

答案 0 :(得分:2)

FStar.Set中定义的集合使用函数作为表示。 因此,例如s个整数集,就是将整数映射到布尔值的函数。 例如,集合{1, 2}表示为以下函数:

// {1, 2}
fun x -> if x = 1 then true
         else (
            if x = 2 then true
            else false 
         )

您可以添加/删除值(即制作新的lambda),或要求一个值成为成员(即应用该函数)。

但是,在比较两组类型T时,您很不走运:对于s1s2两组,s1 = s2意味着任何值x : Ts1 x = s2 x。当T的居民为无穷大时,这是不可计算的。

解决方案该功能表示形式不适合您。您应该有一个可比较的表示形式。 FStar.OrdSet.fst将集合定义为列表:您应该改用列表。

请注意,此OrdSet模块需要对集合中保存的值进行总排序。 (如果要设置一组无序值,我implemented that前一段时间,但是有点不客气...)

相关问题