跳到主要内容

PRISM 函数定义

介绍

在PRISM概率模型检查器中,函数定义是一种强大的工具,它允许您创建可重用的代码块来简化复杂模型的构建。函数可以帮助您:

  • 封装重复逻辑
  • 提高模型可读性
  • 实现复杂计算
  • 参数化模型行为

PRISM支持两种主要函数类型:

  1. 内置函数 - PRISM自带的数学和逻辑函数
  2. 用户定义函数 - 您自己创建的自定义函数

基本语法

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

最佳实践

  1. 命名约定:使用描述性名称,如calculateResponseTime而非calcRT
  2. 参数验证:在函数开始处添加参数检查
    prism
    function int safeDivide(int a, int b) = 
    (b = 0) ? 0 : (a div b);
  3. 文档注释:为复杂函数添加说明
    prism
    // 计算移动平均
    // 参数:newVal-新值, prevAvg-先前平均值, window-窗口大小
    function double movingAvg(double newVal, double prevAvg, int window) =
    (newVal + prevAvg*(window-1)) / window;

总结

PRISM函数定义提供了以下关键优势:

  • 代码复用:避免重复逻辑
  • 抽象能力:隐藏复杂实现细节
  • 参数化:使模型更灵活
  • 可维护性:集中修改点

延伸学习

练习建议

  1. 创建一个计算斐波那契数列的函数
  2. 实现一个三维空间距离计算函数
  3. 设计一个根据系统状态返回不同概率分布的函数

高级主题探索

  • 函数与模块变量的交互
  • 在属性规范中使用函数
  • 函数对模型验证性能的影响
提示

在PRISM GUI中,您可以使用Tools > Model Check > View Functions查看所有已定义的函数