在z3中记录字段

时间:2019-07-11 08:27:32

标签: z3

在z3中按数据类型记录模型

如果两个记录数据类型具有相同的字段,例如

 UNI_MSG : record
    Cmd : UNI_CMD;
    Proc : NODE;
    HomeProc : boolean;
    Data : DATA;
  end;

  INV_CMD : enum {INV_None, INV_Inv, INV_InvAck};

  INV_MSG : record
    Cmd : INV_CMD;
  end;

  RP_CMD : enum {RP_None, RP_Replace};

  RP_MSG : record
    Cmd : RP_CMD;
  end;

UNI_MSG和RP_MSG都具有字段Cmd。 当我使用UNI_MSG记录变量的Cmd字段时,我不知道如何 使用它是因为RP_CMD变量也具有Cmd字段。 z3代码如下:

; This example illustrates basic arithmetic and 
; uninterpreted functions
(declare-datatypes () ((CACHE_STATE CACHE_I CACHE_S CACHE_E)))
(declare-datatypes () ((NODE_CMD NODE_None NODE_Get NODE_GetX)))
(declare-datatypes () ((UNI_CMD UNI_None UNI_Get UNI_GetX UNI_Put UNI_PutX UNI_Nak)))
(declare-datatypes () ((INV_CMD INV_None INV_Inv INV_InvAck)))
(declare-datatypes () ((RP_CMD RP_None RP_Replace)))
(declare-datatypes () ((WB_CMD WB_None WB_Wb)))
(declare-datatypes () ((SHWB_CMD SHWB_None SHWB_ShWb SHWB_FAck)))
(declare-datatypes () ((NAKC_CMD NAKC_None NAKC_Nakc)))
(define-sort NODE () Int)
(define-sort DATA () Int)
(define-sort boolean () Bool)
(declare-datatypes () ((Record_0 (mk-Record_0 (Cmd NAKC_CMD)))))
(declare-datatypes () ((Record_1 (mk-Record_1 (Data DATA)
(HomeProc boolean)
(Proc NODE)
(Cmd SHWB_CMD)))))

(declare-datatypes () ((Record_2 (mk-Record_2 (HomeInvSet boolean)
(InvSet (Array  NODE  boolean))
(HomeShrSet boolean)
(ShrSet (Array  NODE  boolean))
(ShrVld boolean)
(HomeHeadPtr boolean)
(HeadPtr NODE)
(HeadVld boolean)
(Dirty boolean)
(Local boolean)
(Pending boolean)))))

(declare-datatypes () ((Record_3 (mk-Record_3 (CacheData DATA)
(CacheState CACHE_STATE)
(InvMarked boolean)
(ProcCmd NODE_CMD)))))


(declare-datatypes () ((Record_4 (mk-Record_4 (CurrData DATA)
( NakcMsg (  Record_0))
( ShWbMsg (  Record_1))
( WbMsg (  Record_1))
( HomeRpMsg (  Record_0))
( RpMsg (Array  NODE  Record_0))
( HomeInvMsg (  Record_0))
( InvMsg (Array  NODE  Record_0))
( HomeUniMsg (  Record_1))
( UniMsg (Array  NODE  Record_1))
(MemData DATA)
( Dir (  Record_2))
( HomeProc (  Record_3))
( Proc (Array  NODE  Record_3))))))


(declare-const Sta  ( Record_4)) 

(assert (= (Cmd (select (UniMsg Sta)  1 )) UNI_Nak))

(check-sat)

该错误是由record_0和record_1都具有字段Cmd引起的。

1 个答案:

答案 0 :(得分:0)

您可以通过将它们重命名为Cmd0Cmd1等来解决此问题。

SMTLib实际上允许在具有其他类型的字段中使用相同的名称,但是类型系统太弱了,需要您加上名称来解决。如果您确实想保留名称,请发布此问题的一个(较小!)较小版本,以便我们向您展示如何做到这一点。但是实际上,重命名是最好的方法(也是最简单的方法)。