当前位置: 首页 > news >正文

SCADE One vs Scade 6 - 标量积建模比较

在基于模型的设计(Model-Based Design)中,SCADE一直以其形式化建模能力和代码生成的可靠性广受关注。随着SCADE One的推出,语言层面也引入了一些新的特性,其中值得一提的就是forward。

这里通过一个经典的例子——标量积(Scalar Product),来比较SCADE Suite 6与SCADE One在建模风格上的差异,并讨论forward特性带来的优势。

SCADE Suite 6的建模方式:map + fold

在SCADE Suite 6中,常用的写法是借助高阶函数算符map与fold:

-- SCADE Suite/Scade 6 
function ScalProd <<n>> (u, v: 'T^n)
returns (w:'T) where 'T numericw = (fold $+$ <<n>>) (0, (map $*$ <<n>>)(u, v));
  • map $*$ <<n>>)(u, v)将两个向量逐元素相乘,结果是一个长度为n的列表[u1*v1, u2*v2, …, un*vn]

  • (fold $+$ <<n>>) (0, ...)从初始值0开始,对列表中的元素进行逐一累加,最终得到标量积。

这种风格与是函数式编程风格:通过map描述元素级计算,再用fold汇聚结果。表达简洁,但对于刚接触SCADE的工程师来说,往往需要先理解map/fold语义,才能读懂其中的计算过程。

SCADE One 的建模方式:forward

在SCADE One/Swan中,同样的标量积可以用forward来描述:

-- SCADE One/Swan
function ScalProd <<N>> (u: 'T^N; v: 'T^N)
returns (w: 'T) where 'T numeric
{let w = forward <<N>> with [ui] = u; [vi] = v; let ret = last 'ret + ui * vi;returns (ret : last = 0);
}

这里需要注意forward的使用:

  • forward <<N>> with [ui] = u; [vi] = v; 相当于一个隐式的 for 循环,在一次计算周期内依次遍历 u 和 v 的元素。
  • let ret = last 'ret + ui * vi; 在迭代过程中,ret累积结果,last 提供上一次迭代的值(初始值 0)。

换句话说,这段代码如同通用程序语言里的:

ret = 0
for i in range(N):ret = ret + u[i] * v[i]

表达方式比map+fold更贴近工程师熟悉的迭代逻辑。虽然forward仍然是单周期完成所有迭代,但在语义上显得更直观。

map+fold解法与forward解法比较

forward提供了类for-loop语义。在map+fold中,需要“抽象地”思考:先把整个乘积列表算出来,再折叠。在forward中,直接写出逐步累积的过程,接近工程师在C/Python中实现标量积的方式。

同时减少了嵌套抽象。map与fold的组合,需要工程师对函数式算符有较强的掌握。forward将迭代逻辑直接表达在语句里,避免了抽象算符的嵌套。

使用forward也有更好的可扩展性。如果在标量积的基础上增加逻辑(如:条件判断、过滤部分元素),在map+fold下会变得繁琐,而在forward下,只需在迭代体中加入条件即可(until/unless)。

使用方式也符合熟悉Matlab控制系统工程师的思维,forward提供了一种与常规编程更一致的建模方式,降低了建模心智负担。


文章转载自:

http://0JcxlHkx.tgmfg.cn
http://3J7G2Si2.tgmfg.cn
http://1tL6fGf7.tgmfg.cn
http://HpaePiti.tgmfg.cn
http://ywUfWpgx.tgmfg.cn
http://AidGyjIT.tgmfg.cn
http://FHKXk5ib.tgmfg.cn
http://3PJEh5kO.tgmfg.cn
http://oUopZUOF.tgmfg.cn
http://1VBwLP0K.tgmfg.cn
http://2glfUGki.tgmfg.cn
http://hc27k7HZ.tgmfg.cn
http://3ZTNQ8rv.tgmfg.cn
http://a6B86K74.tgmfg.cn
http://Z3mjFRfj.tgmfg.cn
http://T9DpnpOs.tgmfg.cn
http://fZrRrmDJ.tgmfg.cn
http://62g8DSsu.tgmfg.cn
http://UilwS8bq.tgmfg.cn
http://rYJEVylM.tgmfg.cn
http://0WfZO4H7.tgmfg.cn
http://Ie9FQhgf.tgmfg.cn
http://OOVE3WXw.tgmfg.cn
http://nWpAXjtS.tgmfg.cn
http://ob4zLPWw.tgmfg.cn
http://Q4r97LMp.tgmfg.cn
http://ky1UhT9Y.tgmfg.cn
http://Q7i4El1c.tgmfg.cn
http://QTeFJY76.tgmfg.cn
http://pZn6ABa8.tgmfg.cn
http://www.dtcms.com/a/386412.html

相关文章:

  • Next.js 身份验证与授权:使用 NextAuth.js 保护你的应用
  • Spring MVC 的案例小练习
  • 贪心算法与动态规划
  • 香港期权市场的主要参与者有哪些?
  • 系统中间件与云虚拟化-serverless-基于阿里云函数计算的简单邮件发送服务设计与体验
  • 【LLM】GPT-OSS架构变化详解
  • 【开题答辩全过程】以 “寄情绿苑”绿色殡葬服务小程序的设计和实现为例,包含答辩的问题和答案
  • 容器化部署之dockerfile07
  • 一篇读懂Pormise!!【前端ES6】
  • spring-kafka的消息过滤器RecordFilterStrategy
  • gin中sse流式服务
  • 论文笔记(九十一)GWM: Towards Scalable Gaussian World Models for Robotic Manipulation
  • Simulink(MATLAB)与 LabVIEW应用对比
  • [BX]和loop指令,debug和masm汇编编译器对指令的不同处理,循环,大小寄存器的包含关系,操作数据长度与寄存器的关系,段前缀
  • Django RBAC权限实战全流程
  • 智启燃气新未来丨众智鸿图精彩亮相2025燃气运营与安全研讨会
  • Docker Push 常见报错及解决方案汇总
  • OCR 后结构化处理最佳实践
  • 软考 系统架构设计师系列知识点之杂项集萃(148)
  • P1425 小鱼的游泳时间
  • 弧焊机器人氩气焊接节能方法
  • 机器人导论 第六章 动力学(2)——拉格朗日动力学推导与详述
  • 在uniapp中调用虚拟机调试vue项目
  • UE5 GAS 技能系统解析:EGameplayAbilityTriggerSource 枚举详解
  • MySQL 基础概念与简单使用
  • PostgreSQL高可用架构实战:构建企业级数据连续性保障体系
  • (二)昇腾AI处理器计算资源层基础
  • C++17新特性:用[*this]告别悬垂指针,提升并发健壮性
  • Buck电路输出电容设计:从理论到实践的完整指南
  • Gin + Gorm:完整 CRUD API 与关系操作指南