Common Knowledge operators support

This commit is contained in:
Artur Meski
2018-11-24 12:58:26 +00:00
parent ff0031244e
commit 34f7b503c1
6 changed files with 77 additions and 11 deletions

View File

@@ -7,6 +7,7 @@
*/ */
#include "formrsctlk.hh" #include "formrsctlk.hh"
#include "rs.hh"
std::string FormRSCTLK::toStr(void) const std::string FormRSCTLK::toStr(void) const
{ {
@@ -250,3 +251,13 @@ void FormRSCTLK::encodeActions(const SymRS *srs)
arg[1]->encodeActions(srs); arg[1]->encodeActions(srs);
} }
} }
ProcSet FormRSCTLK::getAgentsAsProcSet(RctSys *rs) const
{
ProcSet processes;
for (auto &a : agents)
{
processes.insert(rs->getProcessID(a));
}
return processes;
}

View File

@@ -43,9 +43,13 @@
#define RSCTLK_TF 50 // true/false #define RSCTLK_TF 50 // true/false
#define RSCTLK_NK 61 // Epistemic operators #define RSCTLK_NK 61 // Epistemic operators
#define RSCTLK_NE 62
#define RSCTLK_NC 63
#define RSCTLK_UK 71 #define RSCTLK_UK 71
#define RSCTLK_UE 72
#define RSCTLK_UC 73
#define RSCTLK_COND_1ARG(a) ((a) == RSCTLK_NOT || (a) == RSCTLK_EG || (a) == RSCTLK_EF || (a) == RSCTLK_EX || (a) == RSCTLK_AG || (a) == RSCTLK_AF || (a) == RSCTLK_AX || (a) == RSCTLK_EG_ACT || (a) == RSCTLK_EF_ACT || (a) == RSCTLK_EX_ACT || (a) == RSCTLK_AG_ACT || (a) == RSCTLK_AF_ACT || (a) == RSCTLK_AX_ACT || (a) == RSCTLK_UK || (a) == RSCTLK_NK) #define RSCTLK_COND_1ARG(a) ((a) == RSCTLK_NOT || (a) == RSCTLK_EG || (a) == RSCTLK_EF || (a) == RSCTLK_EX || (a) == RSCTLK_AG || (a) == RSCTLK_AF || (a) == RSCTLK_AX || (a) == RSCTLK_EG_ACT || (a) == RSCTLK_EF_ACT || (a) == RSCTLK_EX_ACT || (a) == RSCTLK_AG_ACT || (a) == RSCTLK_AF_ACT || (a) == RSCTLK_AX_ACT || (a) == RSCTLK_UK || (a) == RSCTLK_NK || (a) == RSCTLK_UE || (a) == RSCTLK_NE || (a) == RSCTLK_UC || (a) == RSCTLK_NC)
#define RSCTLK_COND_2ARG(a) ((a) == RSCTLK_AND || (a) == RSCTLK_OR || (a) == RSCTLK_XOR || (a) == RSCTLK_IMPL || (a) == RSCTLK_EU || (a) == RSCTLK_AU || (a) == RSCTLK_EU_ACT || (a) == RSCTLK_AU_ACT) #define RSCTLK_COND_2ARG(a) ((a) == RSCTLK_AND || (a) == RSCTLK_OR || (a) == RSCTLK_XOR || (a) == RSCTLK_IMPL || (a) == RSCTLK_EU || (a) == RSCTLK_AU || (a) == RSCTLK_EU_ACT || (a) == RSCTLK_AU_ACT)
#define RSCTLK_COND_ACT(a) ((a) > 30 && (a) < 45) #define RSCTLK_COND_ACT(a) ((a) > 30 && (a) < 45)
#define RSCTLK_IS_VALID(a) (RSCTLK_COND_1ARG(a) || RSCTLK_COND_2ARG(a) || (a) == RSCTLK_PV || (a) == RSCTLK_TF) #define RSCTLK_IS_VALID(a) (RSCTLK_COND_1ARG(a) || RSCTLK_COND_2ARG(a) || (a) == RSCTLK_PV || (a) == RSCTLK_TF)
@@ -288,6 +292,7 @@ class FormRSCTLK
assert(oper == RSCTLK_NK || oper == RSCTLK_UK); assert(oper == RSCTLK_NK || oper == RSCTLK_UK);
return *(agents.begin()); return *(agents.begin());
} }
ProcSet getAgentsAsProcSet(RctSys *rs) const;
}; };
#endif #endif

29
mc.cc
View File

@@ -359,6 +359,16 @@ BDD ModelChecker::getStatesRSCTLK(const FormRSCTLK *form)
auto proc_id = srs->rs->getProcessID(form->getSingleAgent()); auto proc_id = srs->rs->getProcessID(form->getSingleAgent());
return *reach - (statesNK(*reach - getStatesRSCTLK(form->getLeftSF()), proc_id) * *reach); return *reach - (statesNK(*reach - getStatesRSCTLK(form->getLeftSF()), proc_id) * *reach);
} }
else if (oper == RSCTLK_NC)
{
auto proc_set = form->getAgentsAsProcSet(srs->rs);
return statesNC(getStatesRSCTLK(form->getLeftSF()) * *reach, proc_set) * *reach;
}
else if (oper == RSCTLK_UC)
{
auto proc_set = form->getAgentsAsProcSet(srs->rs);
return *reach - (statesNC(*reach - getStatesRSCTLK(form->getLeftSF()), proc_set) * *reach);
}
assert(0); // Should never happen assert(0); // Should never happen
return BDD_FALSE; return BDD_FALSE;
@@ -453,6 +463,25 @@ BDD ModelChecker::statesNK(const BDD &states, Process proc_id)
return x; return x;
} }
BDD ModelChecker::statesNC(const BDD &states, ProcSet processes)
{
BDD x = BDD_FALSE;
BDD x_p = *reach;
while (x != x_p)
{
x_p = x;
BDD t = BDD_FALSE;
for (auto const &proc_id : processes)
{
t += x.ExistAbstract(getIthOnly(proc_id));
}
x = t;
}
return x;
}
BDD ModelChecker::getIthOnly(Process proc_id) BDD ModelChecker::getIthOnly(Process proc_id)
{ {
/* if possible, we return the BDD from cache */ /* if possible, we return the BDD from cache */

3
mc.hh
View File

@@ -61,13 +61,14 @@ class ModelChecker
BDD statesEUctx(const BDD *contexts, const BDD &statesA, const BDD &statesB); BDD statesEUctx(const BDD *contexts, const BDD &statesA, const BDD &statesB);
BDD statesEFctx(const BDD *contexts, const BDD &states); BDD statesEFctx(const BDD *contexts, const BDD &states);
BDD statesNK(const BDD &states, Process proc_id); BDD statesNK(const BDD &states, Process proc_id);
BDD statesNC(const BDD &states, ProcSet processes);
BDD getIthOnly(Process proc_id); BDD getIthOnly(Process proc_id);
void cleanup(void); void cleanup(void);
void reorder(void); void reorder(void);
public: public:
ModelChecker(SymRS *srs, Options *opts); ModelChecker(SymRS *srs, Options *opts);

View File

@@ -39,7 +39,8 @@ class rsin_driver;
// Entity_f *ent; // Entity_f *ent;
// Action_f *act; // Action_f *act;
// ActionsVec_f *actionsVec; // ActionsVec_f *actionsVec;
StateConstr *fstc; StateConstr *fstc;
Agents_f *agents;
}; };
%code { %code {
@@ -67,6 +68,7 @@ class rsin_driver;
// %type <act> action // %type <act> action
// %type <actionsVec> actions // %type <actionsVec> actions
%type <fstc> state_constr %type <fstc> state_constr
%type <agents> agents;
//%printer { yyoutput << *$$; } "identifier" //%printer { yyoutput << *$$; } "identifier"
%destructor { delete $$; } "identifier" %destructor { delete $$; } "identifier"
@@ -330,6 +332,19 @@ state_constr: IDENTIFIER DOT IDENTIFIER {
// } // }
// ; // ;
agents:
IDENTIFIER {
Agents_f *ag = new Agents_f;
ag->insert(*$1);
free($1);
$$ = ag;
}
| agents COMMA IDENTIFIER {
$1->insert(*$3);
free($3);
$$ = $1;
}
rsctlk_form: rsctlk_form:
IDENTIFIER DOT IDENTIFIER { IDENTIFIER DOT IDENTIFIER {
$$ = new FormRSCTLK(*$1, *$3); $$ = new FormRSCTLK(*$1, *$3);
@@ -378,16 +393,20 @@ rsctlk_form:
| AG rsctlk_form { | AG rsctlk_form {
$$ = new FormRSCTLK(RSCTLK_AG, $2); $$ = new FormRSCTLK(RSCTLK_AG, $2);
} }
| UK LSB IDENTIFIER RSB LRB rsctlk_form RRB { | UK LSB agents RSB LRB rsctlk_form RRB {
Agents_f agents; $$ = new FormRSCTLK(RSCTLK_UK, *$3, $6);
agents.insert(*$3);
$$ = new FormRSCTLK(RSCTLK_UK, agents, $6);
free($3); free($3);
} }
| NK LSB IDENTIFIER RSB LRB rsctlk_form RRB { | NK LSB agents RSB LRB rsctlk_form RRB {
Agents_f agents; $$ = new FormRSCTLK(RSCTLK_NK, *$3, $6);
agents.insert(*$3); free($3);
$$ = new FormRSCTLK(RSCTLK_NK, agents, $6); }
| UE LSB agents RSB LRB rsctlk_form RRB {
$$ = new FormRSCTLK(RSCTLK_UE, *$3, $6);
free($3);
}
| NE LSB agents RSB LRB rsctlk_form RRB {
$$ = new FormRSCTLK(RSCTLK_NE, *$3, $6);
free($3); free($3);
} }

View File

@@ -30,6 +30,7 @@ struct Reaction {
typedef unsigned int Process; typedef unsigned int Process;
typedef std::vector<std::string> ProcessesById; typedef std::vector<std::string> ProcessesById;
typedef std::map<std::string, Process> ProcessesByName; typedef std::map<std::string, Process> ProcessesByName;
typedef std::set<Process> ProcSet;
typedef std::vector<Reaction> Reactions; typedef std::vector<Reaction> Reactions;
typedef std::map<Process, Reactions> ReactionsForProc; typedef std::map<Process, Reactions> ReactionsForProc;