跳到主要内容

PRISM 属性依赖

简介

在PRISM概率模型检测工具中,属性依赖(Property Dependencies)指的是属性表达式如何引用模型中的变量、常量或其他属性。理解属性依赖是编写正确规范的关键,它直接影响模型检查的准确性和效率。本节将详细介绍PRISM属性依赖的语法规则、常见模式及实际应用。


基本语法结构

PRISM属性规范使用PCTL(概率计算树逻辑)或CSL(连续随机逻辑)语言编写。属性依赖主要通过以下方式体现:

  1. 引用状态变量:直接使用模型定义的变量名。
  2. 常量依赖:通过const定义的常量。
  3. 公式复用:通过formula定义的子表达式。

示例:简单属性依赖

prism
// 模型变量定义
const int N = 3;
formula all_servers_busy = (s1 + s2 + s3) = N;

// 属性依赖示例:P=? [ F all_servers_busy ]
备注

变量名和公式名区分大小写,且必须与模型定义完全一致。


属性依赖的类型

1. 直接变量引用

直接引用模型中的变量或常量:

prism
// 模型片段
module Example
x : [0..2] init 0;
endmodule

// 属性:检查x最终达到最大值
P=? [ F x=2 ]

2. 公式链式依赖

通过formula构建多层依赖关系:

prism
formula step1 = x > 0;
formula step2 = step1 & y < 5;
P=? [ F step2 ]

3. 时间依赖属性

在时间界限内引用变量:

prism
P>=0.9 [ U<=10 x=1 ]  // 10个时间单位内x保持为1的概率

实际案例:云服务器负载均衡

假设一个云服务器系统包含3个节点,每个节点有忙/闲两种状态。我们想验证“至少两个节点同时忙碌”的概率。

模型定义

prism
const int N = 3;
module Node
[req] !busy -> 0.5 : (busy'=true);
[req] busy -> 1.0 : (busy'=false);
endmodule

// 定义3个节点实例
node1 : Node; node2 : Node; node3 : Node;

// 属性依赖公式
formula two_busy = (node1.busy + node2.busy + node3.busy) >= 2;

属性规范

prism
// 稳态概率
S=? [ two_busy ]

// 瞬时概率(在100个时间步内)
P=? [ F<=100 two_busy ]

常见错误与调试

  1. 未定义变量

    prism
    P=? [ F z=1 ]  // 错误!z未在模型中定义
  2. 循环依赖

    prism
    formula a = b + 1;
    formula b = a - 1; // 错误!循环依赖
  3. 类型不匹配

    prism
    formula x = true;
    P=? [ F x=1 ] // 错误!布尔值不能与数值比较
警告

使用PRISM GUI的“模拟验证”功能可逐步检查属性依赖是否合理。


总结

  • 属性依赖是连接模型与规范的核心机制。
  • 通过formula可实现复杂逻辑的模块化。
  • 避免循环依赖和未定义引用是调试关键。

延伸练习

  1. 修改云服务器案例,添加“至少一个节点空闲”的属性。
  2. 尝试用label替代formula定义状态条件,比较两者差异。

附加资源

  • PRISM手册:Properties章节
  • 《Principles of Model Checking》第10章(PCTL/CSL规范)