запись модели по типу данных в 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.
когда я использую поле Cmd переменной записи UNI_MSG, я не знаю, как
используйте его, потому что переменная 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)
Ошибка вызвана тем, что запись_0 и запись_1 имеют поле Cmd.