在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引起的。
答案 0 :(得分:0)
您可以通过将它们重命名为Cmd0
,Cmd1
等来解决此问题。
SMTLib实际上允许在具有其他类型的字段中使用相同的名称,但是类型系统太弱了,需要您加上名称来解决。如果您确实想保留名称,请发布此问题的一个(较小!)较小版本,以便我们向您展示如何做到这一点。但是实际上,重命名是最好的方法(也是最简单的方法)。