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) | 计算x 的y 次方 |
mod(i,n) | 整数取模运算 |
log(x,b) | 计算以b 为底x 的对数 |
暂时先这些,半年前写的,当时到处找PRISM的资料找不到,只能去官网翻使用手册。
基本都是ai翻译加自行理解简化了一下,可能有错误。
写都写了,上传一下。
参考官网原版:https://www.prismmodelchecker.org/manual/ThePRISMLanguage/Introduction