首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在CBMC中表达“精确一次”的更好方法

在CBMC中表达“精确一次”的更好方法
EN

Stack Overflow用户
提问于 2015-03-09 14:01:51
回答 1查看 104关注 0票数 3

我正努力想出一个更好的解决方案,在CBMC (C有界模型检查器)中声明一个“精确一次”的属性。我的意思是,一行中的一个元素位置应该有值1(或任何可以作为布尔值true检查的正数),其余的都必须是零。

M=4

代码语言:javascript
复制
for(i=0;i<M;i++){
__CPROVER_assume( (update[i][0]) ?  
    ( !(update[i][1]) && !(update[i][2])  &&!(update[i][3]) ) :         
     ((update[i][1]) ?  (!(update[i][2])  && !(update[i][3]) ) :                  
     ((update[i][2]) ? !update[i][3] : update[i][3] )) )   ;
}`

对我来说,这是个大问题。假设M=8,我必须做这样的事情:

代码语言:javascript
复制
for(i=0;i<M;i++){
   __CPROVER_assume( (update[i][0]) ?  ( !(update[i][1]) && !(update[i][2])  && !(update[i][3]) && (update[i][4]) && !(update[i][5])  && !(update[i][6]) && !(update[i][7]) )  :
           ((update[i][1]) ?  (!(update[i][2])  && !(update[i][3]) && !(update[i][4]) && !(update[i][5])  && !(update[i][6]) && !(update[i][7]) ) :
             ((update[i][2]) ? ((!update[i][3]) && !(update[i][4]) && !(update[i][5])  && !(update[i][6]) && !(update[i][7]))  :
                   ((update[i][3]) ? (!(update[i][4]) && !(update[i][5])  && !(update[i][6]) && !(update[i][7]))  : 
                   ((update[i][4]) ? (!(update[i][5])  && !(update[i][6]) && !(update[i][7])) : 
                      ((update[i][5]) ? (!(update[i][6]) && !(update[i][7])) :  
                         ((update[i][6]) ? !(update[i][7]) : (update[i][7])))))))) ;
}

检查违反一次是很容易的,但声明它看起来不平凡。我可能还有一个选择:将二维数组问题声明为一维位向量问题,然后执行一些智能xor。但我现在还不确定。

有谁能更好地解决这个问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-09 15:41:13

如何计算真值的数量,然后检查有多少:

代码语言:javascript
复制
for (i = 0; i < M; i++) {
    int n_true = 0;
    int j;

    for (j = 0; j < M; j++) {
        n_true += (update[i][j] ? 1 : 0);
    }

    __CPROVER_assume(n_true == 1);
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28943873

复制
相关文章

相似问题

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