首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >frama-c / ACSL / WP :集合的基数

frama-c / ACSL / WP :集合的基数
EN

Stack Overflow用户
提问于 2020-03-20 17:46:43
回答 1查看 65关注 0票数 2

我经常在其他正式规范中使用集合的基数,我想知道是否可以在带有WP frama-c插件的ACSL中使用它。

例如,在我看来,编写assumes card({*a, *b, *c}) == 3比编写assumes *a != *b && *a != *c && *b != *c更清楚

EN

回答 1

Stack Overflow用户

发布于 2020-05-04 12:29:18

好了,我找到了一个解决方案(我警告你,这是一个很慢的解决方案,为了下面的例子,必须将超时从10秒改为30秒)。此外,它在Frama-C版本中被破坏,声称它找不到Qed库(该bug似乎是在尝试调用logic boolean类型的Frama-C函数时出现的)。它在Frama-C版本的氯气中工作正常(没有测试其他版本)。

代码语言:javascript
复制
/* "set" appears to be a reserved word in frama-c */

/*@ predicate full_card{L}(unsigned int* the_set, integer set_size) =
  \forall integer a, b; 0 <= a < set_size && 0 <= b < set_size && a != b ==> the_set[a] != the_set[b];
*/

/*@ logic boolean in_set_bool{L}(unsigned int* the_set, integer set_size, unsigned int element) =
  set_size == 0 ? \false : element == the_set[0] || in_set_bool(the_set + 1, set_size - 1, element);
*/

/*@ logic integer card{L}(unsigned int* the_set, integer set_size) =
  set_size == 0 ? 0 : (
    in_set_bool(the_set + 1, set_size - 1, the_set[0])
      ? card(the_set + 1, set_size - 1)
      : card(the_set + 1, set_size - 1) + 1);
*/

int main(int argc, char** argv) {
  unsigned int set[] = { 1, 2, 3 };
  unsigned int set_size = 3;

  /*@ assert full_card(&set[0], set_size); */
  /*@ assert card(&set[0], set_size) == 3; */

  unsigned int set_two[] = { 3, 2, 1, 3 };
  unsigned int set_two_size = 4;

  /*@ assert card(&set_two[0], set_two_size) == 3; */
  /*@ assert !full_card(&set_two[0], set_two_size); */
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60771774

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档