PRISM 函数定义
介绍
在PRISM概率模型检查器中,函数定义是一种强大的工具,它允许您创建可重用的代码块来简化复杂模型的构建。函数可以帮助您:
- 封装重复逻辑
- 提高模型可读性
- 实现复杂计算
- 参数化模型行为
PRISM支持两种主要函数类型:
- 内置函数 - PRISM自带的数学和逻辑函数
- 用户定义函数 - 您自己创建的自定义函数
基本语法
PRISM中使用以下语法定义函数:
prism
// 标量函数
function int funcName(int param1, bool param2) = expression;
// 多返回值函数
function (int,int) funcName() = (expr1, expr2);
备注
函数定义通常放在模型文件的// Functions
部分,位于模块定义之前
函数类型详解
1. 标量函数
最简单的函数形式,返回单个值:
prism
// 计算两个数的最大值
function int max(int a, int b) = a > b ? a : b;
// 判断是否为偶数
function bool isEven(int x) = (x mod 2) = 0;
使用示例:
prism
formula threshold = max(5, current_value) < 10;
2. 多返回值函数
可以返回多个值的函数:
prism
// 同时计算商和余数
function (int,int) divMod(int dividend, int divisor) =
(dividend div divisor, dividend mod divisor);
使用示例:
prism
const int x = 7;
const int y = 3;
formula (q,r) = divMod(x,y); // q=2, r=1
3. 递归函数
PRISM支持递归函数定义:
prism
// 计算阶乘
function int factorial(int n) =
(n <= 1) ? 1 : (n * factorial(n-1));
警告
递归函数需要确保有终止条件,否则可能导致模型无法分析
实际应用案例
案例1:网络协议超时计算
prism
// 指数退避算法计算重试间隔
function int backoffTime(int attempt, int base) =
min(base * (2 ^ (attempt-1)), max_timeout);
module Sender
attempt : [1..5] init 1;
[retry] attempt < 5 ->
(attempt'=attempt+1) &
(delay'=backoffTime(attempt, 100));
endmodule
案例2:资源分配策略
prism
// 根据优先级和资源量计算分配比例
function (double,double) allocate(double p1, double p2, double total) =
let { sum = p1 + p2 } in
(total * p1/sum, total * p2/sum);
module Resources
const double priority_A = 3.0;
const double priority_B = 2.0;
const double available = 100.0;
formula (alloc_A, alloc_B) = allocate(priority_A, priority_B, available);
endmodule
最佳实践
- 命名约定:使用描述性名称,如
calculateResponseTime
而非calcRT
- 参数验证:在函数开始处添加参数检查
prism
function int safeDivide(int a, int b) =
(b = 0) ? 0 : (a div b); - 文档注释:为复杂函数添加说明
prism
// 计算移动平均
// 参数:newVal-新值, prevAvg-先前平均值, window-窗口大小
function double movingAvg(double newVal, double prevAvg, int window) =
(newVal + prevAvg*(window-1)) / window;
总结
PRISM函数定义提供了以下关键优势:
- 代码复用:避免重复逻辑
- 抽象能力:隐藏复杂实现细节
- 参数化:使模型更灵活
- 可维护性:集中修改点
延伸学习
练习建议
- 创建一个计算斐波那契数列的函数
- 实现一个三维空间距离计算函数
- 设计一个根据系统状态返回不同概率分布的函数
高级主题探索
- 函数与模块变量的交互
- 在属性规范中使用函数
- 函数对模型验证性能的影响
提示
在PRISM GUI中,您可以使用Tools > Model Check > View Functions
查看所有已定义的函数