【PRISM】概率模型检测工具,基础语法

Example1

// Example 1
// Two process mutual exclusion

mdp

module M1

    x : [0..2] init 0;

    [] x=0 -> 0.8:(x'=0) + 0.2:(x'=1);
    [] x=1 & y!=2 -> (x'=2);
    [] x=2 -> 0.5:(x'=2) + 0.5:(x'=0);

endmodule

module M2

    y : [0..2] init 0;

    [] y=0 -> 0.8:(y'=0) + 0.2:(y'=1);
    [] y=1 & x!=2 -> (y'=2);
    [] y=2 -> 0.5:(y'=2) + 0.5:(y'=0);

endmodule

Example2

一个连续时间马尔可夫链(CTMC),它对一个有N个位置的作业队列以及一个从队列中移除作业并进行处理的服务器进行建模。PRISM 代码如下:

// Example 2
// N-place queue + server

ctmc

const int N = 10;
const double mu = 1/10;
const double lambda = 1/2;
const double gamma = 1/3;

module queue
     q : [0..N];

     [] q<N -> mu:(q'=q+1);
     [] q=N -> mu:(q'=q);
     [serve] q>0 -> lambda:(q'=q-1);
endmodule

module server
     s : [0..1];

     [serve] s=0 -> 1:(s'=1);
     [] s=1 -> gamma:(s'=0);
endmodule

一、模型类型关键字

  • dtmc 离散时间马尔可夫链 discrete-time Markov chain

  • ctmc 连续时间马尔可夫链 continuous-time Markov chain

  • mdp 马尔可夫决策过程(或概率自动机) Markov decision process (or probabilistic automaton)

  • pta 概率定时自动机 probabilistic timed automaton

  • pomdp 部分可观测马尔可夫决策过程 partially observable Markov decision process

  • popta 部分可观测概率定时自动机 partially observable probabilistic timed automaton

这通常位于文件的最开头,但实际上可以出现在文件的任何位置(除了在模块和其他声明内部)。

如果未包含此类模型类型声明,则默认情况下模型被假定为 MDP。

二、模块和变量

模块

每个模块代表一个进程。模块的指定方式如下:

module name
...
endmodule

整数

变量类型有限,只有整数和布尔型

x : [0..2] init 0;

表示一个范围0到2的整数变量,初始值为0。

布尔性

b : bool init false;

并不一定要给出初始值或范围,比如:

a : [0..2];
b : bool;
x : int;
y : int init 3;

三、Commands 命令

3.1 基本定义

如果概率总和不为1,会报错。

更新概率为1的时候可以省略1.0。

可以读取别的模块的变量,但只能修改自己模块的变量。

“->”右侧的表达式指的是更新之前的状态。

一个模块如果有多个变量,更新会描述每个变量的新值。

每个元素需要用()括起来。需要更新的元素用“&”连接。

command1

[] x=0 -> 0.8:(x'=0) + 0.2:(x'=1);

表示当x的值为0时,x有0.8的概率变成0,0.2的概率变成1。

command2

[] x=1 & y!=2 -> (x'=2);

表示当x等于1且y不等于2时,x变为2。此处省略了1.0,省略前为

[] x=1 & y!=2 -> 1.0:(x'=2);

command3

[] x1=0 & x2>0 & x2<10 -> 0.5:(x1'=1)&(x2'=x2+1) + 0.5:(x1'=2)&(x2'=x2-1);

表示当x1为0且x2在0到10 的范围内时,有0.5的概率x1变成1,x2加一;另外有0.5的概率x1变为2,x2减一。

command4

[] x1>10 | x2>10 -> (x1'=x1)&(x2'=x2);
[] x1>10 | x2>10 -> (x1'=x1);
[] x1>10 | x2>10 -> true;

表示当x1

以上三条命令等效。关键字true可以表示没有变量更新。

command5

[] x1=0 & x2=1 -> (x1'=2)&(x2'=x1)

表示当x1为0且x2为1时,状态改变为x1=2,x2==x1。

这里好奇去测了一下,没有发现报错。

ctmc

module test

x:int;
[] x=0 -> 0.1:(x'=0) + 0.2:(x'=1);

endmodule

3.2 并行命令

[] x=0 -> 0.8:(x'=0) + 0.2:(x'=1);
[] y=0 -> 0.8:(y'=0) + 0.2:(y'=1);

这两个命令在 x,y 状态为(0,0)时,可能会同时启用。

可以这样表示

0.8:(0,0) + 0.1:(1,0) + 0.1:(0,1)

3.3 CTMC

在CTMC(连续时间马尔可夫链)里,,标记的是更新的速率而非概率。如:

[] x=0 -> 50:(x'=1) + 60:(x'=2);

其中,50,60都是更新的速率。

四、特殊变量

4.1 常量

const int radius = 12;
const double pi = 3.141592;
const double area = pi * radius * radius;
const bool yes = true;

常量可以在任何需要常量值的地方使用,例如变量的下限或上限范围(如N在Example2中)、与更新相关的概率或速率(如mu在Example2),或者在守护条件或更新中的任何地方。正如后面将描述的,常量也可以留作未定义,并在以后使用实验指定为单个值或值的范围。

4.2 全局变量

全局变量的声明方式与模块的局部变量完全相同,不同之处在于声明不能在任何模块的定义内部。一些示例声明如下:

global g : [1..10];
global b : bool init true;

全局变量可以被任何模块修改,并为模块之间的交互提供了另一种方式。对全局变量使用的一个重要限制是,与其他模块同步的命令(即带有动作标签的命令;见“同步”一节)不能修改全局变量。PRISM 会检测到这一点并报告错误。

五、表达式

5.1 运算符

以下运算符按照优先级展示:

运算符含义
-负号
*, /乘除(除法为浮点型,如22/7的结果为3.142857,而不是3)
+, -加减
<, <=, >=, >关系运算符
=, !=相等运算符
!
&
|
<=>
=>
?条件。condition ? a : b意味着“如果condition为真,则为a,否则为b

5.2 内置函数

函数
min() , max()
floor(x) , ceil(x)分别将x向下和向上舍入到最接近的整数
round(x)x四舍五入到最接近的整数
pow(x,y)计算xy次方
mod(i,n)整数取模运算
log(x,b)计算以b为底x的对数

暂时先这些,半年前写的,当时到处找PRISM的资料找不到,只能去官网翻使用手册。

基本都是ai翻译加自行理解简化了一下,可能有错误。

写都写了,上传一下。

参考官网原版:https://www.prismmodelchecker.org/manual/ThePRISMLanguage/Introduction

下载链接:https://www.prismmodelchecker.org/download.php

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值