You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在TLA+中对函数内的元组进行模式匹配?

TLA+ 实现三路开关IO值到模式的映射

问题场景

我正在建模一个包含三路开关的工业流程,该三路开关属于一个更大的IO数组。需要将两个IO引脚3way1和3way2的布尔值组合,映射为"forward"、"pause"、"backward"三种模式。现有基础代码如下:

VARIABLES
    Input

inputSet == {"3way1", "3way2", ...} \* 其余值无关紧要

directions == {"forward","pause","backward"}

TypeOk ==
    Input \in [inputSet |-> BOOLEAN]

----\* 不变式
ThreewaySwitchIsNeverInvalid == ~(Input.3way1 /\ Input.3way2)

遇到的问题

尝试用元组做模式匹配的方式实现映射函数时触发语法错误,错误代码如下:

getMode[x \in [inputSet |-> BOOLEAN]] ==
    [<<TRUE, FALSE>> |-> "forward",
    <<FALSE, FALSE>> |-> "pause",
    <<FALSE, TRUE>> |-> "backward"][<<x.3way1, x.3way2>>] 

报错信息:Encountered "|->" at line XX column yy in module Factory and token ">>"

移除元组括号后依旧报错:Encountered "|->" at line XX column yy in module Factory and token "FALSE"

解决方案

TLA+ 不支持直接用元组作为字面量函数的定义域键来构建映射,换用以下两种方式均可实现需求:

方式一:条件判断实现

getMode[x \in [inputSet |-> BOOLEAN]] ==
    IF x.3way1 /\ ~x.3way2 THEN "forward"
    ELSIF ~x.3way1 /\ ~x.3way2 THEN "pause"
    ELSIF ~x.3way1 /\ x.3way2 THEN "backward"
    ELSE \* 受不变式ThreewaySwitchIsNeverInvalid约束,此分支不会触发
        ASSERT FALSE

方式二:先定义合法集合再构建映射函数

validPairs == {<<TRUE, FALSE>>, <<FALSE, FALSE>>, <<FALSE, TRUE>>}
modeMap == [p \in validPairs |-> 
    CASE p = <<TRUE, FALSE>> -> "forward"
         p = <<FALSE, FALSE>> -> "pause"
         p = <<FALSE, TRUE>> -> "backward"]

getMode[x \in [inputSet |-> BOOLEAN]] == modeMap[<<x.3way1, x.3way2>>]

内容的提问来源于stack exchange,提问作者Alex Shirley

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 03:37:15