【SPIN】高级时序规范(SPIN学习系列--6)
时序操作符[](总是)和 <>(最终)可应用于任何LTL公式,因此 []<><>A 和 <>[]<>(A ∧ []B) 在语法上是正确的。本书不涉及LTL的演绎理论(如公理、推理规则及公式的结合律、交换律等定理),仅提及两个结论:
- 连续出现的同名时序操作符序列可简化为单个操作符。例如,[] []<><>A 等价于 []<>A。
- 交替出现的 [] 和 <> 序列可简化为 []<>或 <>[] 两种双操作符组合之一。例如,<>[]<>A 等价于 []<>A。
因此,任意一元时序操作符序列均可简化为一个或两个操作符的序列。
接下来两个小节将介绍双操作符序列在表达常见正确性规范中的应用,随后是关于二元时序操作符U(直到)的讨论,最后介绍在SPIN中较少使用的“下一个”(X)操作符。
含超过两三个操作符的时序逻辑公式难以理解。堪萨斯州立大学开发了一套模式(patterns)帮助编写时序逻辑正确性规范,这些模式按优先级、存在性等属性及“之前”“之间”等作用域分类,不仅适用于SPIN的线性时序逻辑,也适用于其他验证逻辑。项目网站地址见附录B。
锁存(Latching)
公式 <>[]A 表示锁存属性:A在计算初始时可能为假,但最终变为真并保持为真。
状态序列:s0 s1 s2 s3 s4 s5 s6 s7
A的取值:¬A ¬A A A A A A A
在s0状态,<>[]A为真:尽管s0和s1中A为假,但s2及之后所有状态A均为真。
锁存属性很重要,因为“初始且始终为真”的属性并不常见:通常需执行某些操作使属性为真,且一旦为真便持续为真。锁存也可描述异常情况,例如多处理器系统中若处理器故障,其变量自动置零。对清单5.1中的程序,可断言 <>failsQ → <>[]¬wantQ(若执行进程Q的处理器故障,wantQ将锁存为假)。由此可推导出:即使Q故障,进程P也不会饥饿,因为第7行的条件wantQ将始终为假,可执行第10行的else分支。
无限次出现(Infinitely Often)
公式 []<>A 表示A无限次为真:A无需始终为真,但在计算的任意状态s,A在s或之后某状态为真。
状态序列:s0 s1 s2 s3 s4 s5 s6 s7
A的取值:¬A ¬A ¬A A ¬A ¬A ¬A ¬A
A在s3、s9、s15…等状态为真,因此对任意状态si,A必在si, si+1,…中某状态为真。
对临界区问题的解,活性(liveness)不仅指进程能进入临界区,还指能重复进入。在PROMELA中可如下建模:设置表示进程P在临界区的变量后,立即重置以表示离开临界区:
active proctype P() {do:: /* 尝试进入临界区 */csp = true; // 进入临界区csp = false; // 离开临界区od
}
若算法无饥饿,则可用时序公式 []<>csp 验证程序。
5.9.3 优先级(Precedence)
一元操作符 [] 和 <> 无法表达“时间先后”类属性(如A必须在B之前为真)。此类优先级属性可通过二元操作符U(直到,SPIN中写作U)表示为 ¬B U A,含义为“B保持为假,直到A变为真”。形式化定义:
在计算τ的状态si,p U q为真当且仅当存在k ≥ i,使得sk中q为真,且对所有i ≤ j < k,sj中p为真。
若si中q已为真,则第二个条件自动满足。
例1:在以下计算的s0状态,¬B U A为真,因B在A为假时保持为假,直到s4中A为真时B也为真。
状态:s0 s1 s2 s3 s4 s5
A,B取值:¬A,¬B ¬A,¬B ¬A,¬B ¬A,¬B A,B ¬A,B
例2:即使s4后B仍为假,¬B U A在s0状态仍为真,因只需保证A首次为真前B为假。
状态:s0 s1 s2 s3 s4 s5
A,B取值:¬A,¬B ¬A,¬B A,¬B ¬A,¬B ¬A,¬B ¬A,¬B
U称为“强直到”操作符,因要求右侧子公式最终为真。事实上,<>q 可定义为 true U q(因true恒真,true U q等价于q最终为真)。
弱直到操作符W不要求右侧子公式最终为真,二者关系为:
p U q ≡ p W q ∧ <>q,p W q ≡ p U q ∨[]p
注意:SPIN不支持弱直到操作符W。
高级内容:V操作符
SPIN中的V操作符定义为 pVq ≡ !( (!p) U (!q) ),与W不同(若等价则应为 !( (!q) U (!p && !q) ))。
5.9.4 超越(Overtaking)
以Peterson算法(清单5.4)为例,演示用U操作符描述“一次有界超越”(one-bounded overtaking):若进程P尝试进入临界区,进程Q最多可在P之前进入临界区一次。
定义符号:
#define ptry P@try // P在尝试进入临界区
#define qcs Q@cs // Q在临界区
#define pcs P@cs // P在临界区
“一次有界超越”的LTL公式为:
[] ( ptry -> ( !qcs U ( qcs U (!qcs U pcs) ) ) )
该嵌套U公式表示:当P尝试进入临界区(ptry为真)时,计算必须按以下顺序出现区间:
(a) Q不在临界区(!qcs);
(b) Q在临界区(qcs);
© Q再次不在临界区(!qcs);
(d) 最终P进入临界区(pcs)。
根据U操作符定义,区间可空,但公式正确性保证在pcs为真前,qcs为真的区间最多出现一次。
对清单5.4的程序验证此公式,可证明“一次有界超越”成立。
清单5.4 Peterson算法
1 bool wantP, wantQ;
2 byte last = 1;
3
4 active proctype P() {
5 do
6 :: wantP = true; // P希望进入临界区
7 last = 1; // 设置最后请求为P
8 try: (wantQ == false) || (last == 2); // 尝试进入(Q不希望进入 或 最后请求为Q)
9 cs: wantP = false; // 离开临界区
10 od
11 }
12
13 active proctype Q() {
14 do
15 :: wantQ = true; // Q希望进入临界区
16 last = 2; // 设置最后请求为Q
17 try: (wantP == false) || (last == 1); // 尝试进入(P不希望进入 或 最后请求为P)
18 cs: wantQ = false; // 离开临界区
19 od
20 }
注意:SPIN中U操作符为左结合,而标准LTL中U为右结合(更符合区间序列语义)。为避免歧义,需大量使用括号!
高级内容:用弱直到实现有界超越
通常“一次有界超越”应用弱直到W验证(因进程可能不尝试进入临界区,qcs可能始终为假)。SPIN无W,故用U替代,验证仍有效(清单5.4的算法未建模“进程永远停留在非临界区”的场景)。
下一个(Next)
时序逻辑包含一元操作符X(下一个,SPIN中写作X),X A在状态si为真当且仅当si+1中A为真。X的局限性在于:
- 并发系统抽象特性:并发/分布式系统通常不关注具体时间点(如客户端何时收到服务,只需保证“最终”而非“下一个状态”)。实时系统的时间建模见11.3和11.4节案例研究。
- 抗颤动不变性(Stutter Invariance):不含X的时序公式具有抗颤动性,即删除连续重复状态不影响公式真值。SPIN的部分序约简(partial order reduction)优化要求规范具有抗颤动性,而LTL公式自动满足这一点(SPIN警告信息提示:never断言需抗颤动,由LTL生成的断言天然满足)。
代码与知识点解析
1. 锁存属性(<>[]A)
- 作用:确保某属性最终稳定为真。
- 场景:故障处理(如变量锁存为特定值)、资源初始化完成后保持可用状态。
- PROMELA关联:通过状态标签(如cs)和远程引用(如P@cs)标记稳定状态,结合LTL公式 <> 验证。
2. 无限次出现([]<>A)
- 作用:保证活性,如进程无限次进入临界区。
- 代码实现:
active proctype P() {do:: csp = true; // 进入临界区csp = false; // 离开临界区(允许重复进入)od }
- 用LTL公式 []<>csp 验证csp无限次为真。
3. 强直到操作符U
- 语法:p U q,表示“p持续为真,直到q为真且q最终为真”。
- 应用场景:
- 优先级:A必须在B前发生(¬B U A)。
- 有界超越:嵌套U公式描述事件序列(如Q最多超越P一次)。
- SPIN注意事项:
- 左结合性,需显式括号避免歧义。
- 用U替代W时,需确保右侧条件最终成立(如算法保证进程会尝试进入临界区)。
4. Peterson算法与超越验证
- 算法逻辑:通过标志变量(wantP/wantQ)和last标记实现互斥,允许Q最多在P前进入临界区一次。
- 关键公式:
[] (ptry -> (!qcs U (qcs U (!qcs U pcs))) )
- 含义:当P尝试进入(ptry),Q最多进入临界区一次(qcs出现一次),最终P进入(pcs)。
- 验证意义:确保公平性,避免某进程无限次被另一进程超越。
5. 抗颤动性与X操作符
- 抗颤动性:SPIN优化依赖规范不敏感于连续重复状态,LTL天然满足,而含X的公式可能不满足。
- X的局限性:仅用于精确时间建模(如实时系统),一般并发验证优先使用[]/<>/U。
总结
高级时序规范通过组合[]/<>/U操作符,可精确描述锁存、无限活性、优先级、有界超越等复杂属性。在SPIN中需注意操作符结合性、括号使用及抗颤动性要求,合理利用远程引用和进程变量引用,结合LTL公式完成正确性验证。
相关文章:
【SPIN】高级时序规范(SPIN学习系列--6)
时序操作符[](总是)和 <>(最终)可应用于任何LTL公式,因此 []<><>A 和 <>[]<>(A ∧ []B) 在语法上是正确的。本书不涉及LTL的演绎理论(如公理、推理规则及公式的结合律、交换…...
C语言学习之内存函数
今天我们来学习一下C语言中内存函数 以下内存函数的使用均需要包含头文件<string.h> 目录 memcpy函数的使用及其模拟实现 memcpy函数的模拟实现 memmove函数的使用和模拟实现 memmove函数的模拟实现 memset函数的使用 memcmp函数的使用 memcpy函数的使用及其模拟实现…...
Python 数据库编程
一、数据库连接基础 1. 标准流程 import database_module # 如mysql.connector, sqlite3等 # 1. 建立连接 connection database_module.connect( host"localhost", user"username", password"password", database"dbnam…...
软考软件评测师——软件工程之开发模型与方法
目录 一、核心概念 二、主流模型详解 (一)经典瀑布模型 (二)螺旋演进模型 (三)增量交付模型 (四)原型验证模型 (五)敏捷开发实践 三、模型选择指南 四…...
机器学习入门
机器学习入门 1 . 机器学习是什么? 机器学习(Machine Learning, ML)是一种用数据经验替代显式规则编程来完成任务的方法──模型从样本 (X, y) 中学习 映射函数 f: X → Y,并在新样本上做出预测。和传统“if … else”程序相比&…...
git学习与使用(远程仓库、分支、工作流)
文章目录 前言简介git的工作流程git的安装配置git环境:git config --globalgit的基本使用新建目录初始化仓库(repository)添加到暂存区新增/修改/删除 文件状态会改变 提交到仓库查看提交(commit)的历史记录git其他命令…...
制造业或跨境电商相关行业三种模式:OEM、ODM、OBM
一、基础概念对比 模式定义核心能力利润来源控制权OEM代工生产(贴牌生产)纯生产制造能力加工费(薄利)品牌方掌控一切ODM设计生产(自主设计代工)设计研发能力设计溢价生产利润制造商掌握设计OBM自主品牌&am…...
APPtrace 智能参数系统:重构 App 用户增长与运营逻辑
一、免填时代:APPtrace 颠覆传统参数传递模式 传统 App 依赖「邀请码 / 手动绑定」实现用户关联,流程繁琐导致 20%-30% 的用户流失。APPtrace 通过 **「链接参数自动传递 安装后智能识别」** 技术,让用户在无感知状态下完成关系绑定、场景还…...
在 Excel 中使用 C# .NET 用户定义函数 操作步骤
点开选项 点击加载项 点击跳转 点击浏览 选择仙盟excel...
PyTest
一、基本用法: 1.测试框架做了什么: (1).测试发现 a.创建test_开头的文件 b.创建Test开头的类 c.创建test_开头的函数或方法 pytest中以每一个函数或方法作为一个用例 pytest主要以名字区分普通函数(方法)、用例 pytest的启动方式:在给定的项目中执行pytest命令即可 p…...
Python Day27 学习
今天学习讲义Day17的内容:无监督算法中的聚类浙大疏锦行 Q1. 什么是聚类? 本质上就是一种分组分类 关于聚类的准备工作: 代码实现 # 先运行之前预处理好的代码 import pandas as pd import pandas as pd #用于数据处理和分析ÿ…...
在 Win 10 上,Tcl/Tk 脚本2个示例
set PATH 新增 D:\Git\mingw64\bin where tclsh D:\Git\mingw64\bin\tclsh.exe where wish D:\Git\mingw64\bin\wish.exe 编写 test_tk.tcl 如下 #!/usr/bin/tclsh # test 文件对话框 package require Tk# 弹出文件选择对话框,限制选择.txt文件 set filePath […...
渐开线少齿差传动学习笔记
之前看到了一个渐开线一齿差的视频,觉得比较有意思,想自己动手做一个看看,下面是最开始尝试的一个失败的结果,不知道小伙伴们发现问题了没? 本来就是想凑一凑看看,但是发现不是凑起来不是件容易的事。那么…...
基于CATIA参数化圆锥建模的自动化插件开发实践——NX建模之圆锥体命令的参考与移植(二)
引言 在CATIA二次开发领域,参数化建模技术可提升复杂几何体的创建效率达60%。本文基于PySide6 GUI框架与pycatia接口库,深度解析锥体自动化建模工具的开发实践。该工具创新性地融合了NX的交互逻辑与CATIA的混合建模技术,实现双模式输入(高度/锥角)的智能参数转换,较传统…...
Java集合框架详解:单列集合与双列集合
目录 1. 引言:为什么需要集合框架 2. 基础概念:集合框架概述 2.1 集合框架的结构 编辑 编辑 2.2 集合与数组的比较 3. 前置知识:理解集合框架背后的基础数据结构 3.1 数组 3.2 链表 3.3 哈希表 3.4 二叉树与二叉查找树 3.5 红…...
leetcode 33. Search in Rotated Sorted Array
题目描述 可以发现的是,将数组从中间分开成左右两部分的时候,一定至少有一部分的数组是有序的。左部分[left,mid-1],右部分[mid1,right]。 第一种情况:左右两部分都是有序的,说明nums[mid]就是整个数组的最大值。此时…...
OpenCV 图像色彩空间转换
一、知识点: 1、色彩空间转换函数 (1)、void cvtColor( InputArray src, OutputArray dst, int code, int dstCn 0, AlgorithmHint hint cv::ALGO_HINT_DEFAULT ); (2)、将图像从一种颜色空间转换为另一种。 (3)、参数说明: src: 输入图像,即要进行颜…...
python-leetcode 69.最小栈
题目: 设计一个支持push,pop,top,操作,并能在常数时间内检索到最小元素的栈。 辅助栈法: 1:使用两个栈,一个主栈用于存储所有元素,另一个辅助栈用于存储当前元素的最小值 2: 每次push时,将元…...
C#基础:yield return关键字的特点
一、特点 1.最终返回的结果是IEnumerable<T> 2.使用yield return时,返回的是单个元素(即T) 3.好处:延迟加载,需要时才计算 二、验证 通过打断点可知,只有当listB遍历的时候,才会进入Get…...
机器学习 集成学习方法之随机森林
集成学习方法之随机森林 1 集成学习2 随机森林的算法原理2.1 Sklearn API2.2 示例 1 集成学习 机器学习中有一种大类叫集成学习(Ensemble Learning),集成学习的基本思想就是将多个分类器组合,从而实现一个预测效果更好的集成分类…...
【Vue篇】组件的武林绝学:状态风暴下的乾坤挪移术
引言 🔍 Vue组件迷雾重重? ✧ Scoped如何实现样式隔离? ✧ Data为何必须是函数? ✧ 父子组件如何跨域通信? ✧ Props单向数据流如何破局? 🚀 本文直击组件化七大核心: ▸ 样式隔离原…...
使用亮数据代理IP+Python爬虫批量爬取招聘信息训练面试类AI智能体(手把手教学版)
文章目录 一、为什么要用代理IP?(重要!!!)二、环境准备(三件套走起)2.1 安装必备库(pip大法好)2.2 获取亮数据代理(官网注册送试用) 三、编写爬虫代码&#x…...
【MySQL】第七弹——复习总结 视图
文章目录 🌏客户端和数据库操作🌏表操作🌏CRUD 增删改查总结🌏数据库约束🌏表的设计🌏分组查询🌏聚合函数🌏联合查询🌏SQL语句中各部分的执行顺序🪐视图 &…...
基于Springboot + vue3实现的工商局商家管理系统
项目描述 本系统包含管理员、商家两个角色。 管理员角色: 用户管理:管理系统中所有用户的信息,包括添加、删除和修改用户。 许可证申请管理:管理商家的许可证申请,包括搜索、修改或删除许可证申请。 许可证审批管理…...
前端开发——前端样式BUG调试全指南2025终极版
前端开发——前端样式BUG调试全指南2025终极版 前端样式BUG调试指南(2025终极版)一、调试方法论与工具链1. 问题定位三板斧(1) 现象复现与特征提取(2) 现代调试工具组合拳(3) 三维问题定位法 2. 深度排查六步法步骤1:样式覆盖检测步骤2&#…...
【DeepSeek】为什么需要linux-header
编译Linux驱动程序时,通常需要 Linux内核头文件(linux-headers),而不是完整的源代码(linux-source)。以下是详细解释: 1. 为什么需要内核头文件? 头文件的作用: 内核头文…...
c语言刷题之实际问题
小乐乐定闹钟 代码如下: 小乐乐排电梯 代码如下: 小乐乐与欧几里得 代码如下: 小乐乐改数字 代码如下: 小乐乐走台阶 代码如下: 台阶为1,2时走法分别1,2种 1:(1) 2:(1,1),(2) 要走完n阶时,即我…...
【图像大模型】Kolors:基于自监督学习的通用视觉色彩增强系统深度解析
Kolors:基于自监督学习的通用视觉色彩增强系统深度解析 一、项目架构与技术原理1.1 系统定位与核心能力1.2 核心算法突破1.2.1 色彩感知表征学习1.2.2 动态色彩变换矩阵 二、系统实现与训练策略2.1 训练框架设计2.1.1 自监督预训练 2.2 损失函数设计 三、实战部署指…...
生产消费者模型 读写者模型
概念 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据…...
每日Prompt:双重曝光
提示词 双重曝光,Midjourney 风格,融合、混合、叠加的双重曝光图像,双重曝光风格。一幅由 Yukisakura 创作的杰出杰作,展现了一个奇妙的双重曝光构图,将阿拉贡阿拉松之子的剪影与生机勃勃春季里中土世界视觉上引人注目…...
基于springboot3 VUE3 火车订票系统前后端分离项目适合新手学习的项目包含 智能客服 换乘算法
博主介绍:专注于Java(springboot ssm 等开发框架) vue .net php phython node.js uniapp 微信小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设,从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆…...
DAY29 超大力王爱学Python
知识点回顾 类的装饰器装饰器思想的进一步理解:外部修改、动态类方法的定义:内部定义和外部定义 作业:复习类和函数的知识点,写下自己过去29天的学习心得,如对函数和类的理解,对python这门工具的理解等&…...
jvm对象压缩
最近在看一些文章,知道64位jvm在启动时指定-XX:UseCompressedOops后就会开启压缩,但是怎么压缩的,以及什么情况下压缩失效,没有一篇文章讲的特别透彻,在这里记录一下,后面抽时间进行更新。 参考文档 https…...
TripGenie:畅游济南旅行规划助手:个人工作纪实(十八)
本周,我增加了网页搜索并在右侧显示搜索链接与标题的功能,通过这个功能,可以帮助用户搜索网络上关于济南旅游的信息,提高用户检索信息的速度,用户可以通过点击网页链接了解更多关于济南的信息。 首先,我设计…...
Brooks Polycold快速循环水蒸气冷冻泵客户使用手含电路图,适用于真空室应用
Brooks Polycold快速循环水蒸气冷冻泵客户使用手含电路图,适用于真空室应用...
Rofin PowerLine E Air维护和集成手侧激光Maintenance and Integration Manual
Rofin PowerLine E Air维护和集成手侧激光Maintenance and Integration Manual...
C++中String类
1.String学习前的了解 1.1范围for和auto关键字 范围 for 循环 范围 for 循环是 C11 引入的一种语法糖,用于简化遍历容器或序列的代码。其基本语法如下: 迭代器版本: 范围for主要用来遍历一个容器(数据结构).范围for的(…...
LSTM语言模型验证代码
#任务:基于已有文本数据,建立LSTM模型,预测序列文字 1 完成数据预处理,将文字序列数据转化为可用于LSTM输入的数据。 2 查看文字数据预处理后的数据结构,并进行数据分离操作 3 针对字符串输入(“In the hea…...
Nextjs App Router 开发指南
Next.js是一个用于构建全栈web应用的React框架。App Router 是 nextjs 的基于文件系统的路由器,它使用了React的最新特性,比如 Server Components, Suspense, 和 Server Functions。 术语 树(Tree): 一种用于可视化的层次结构。例如,包含父…...
测试W5500的第3步_使用ioLibrary库创建TCPServer
W5500是一款具有8个Socket的网络芯片,支持TCP Server模式,最多可同时连接8个客户端。本文介绍了基于STM32F10x和W5500的TCP Server实现,包括SPI初始化、W5500复位、网络参数配置、Socket状态管理等功能,适用于需要多客户端连接的嵌…...
Python训练营打卡——DAY31(2025.5.20)
目录 一、机器学习项目的流程 二、文件的组织 1. 项目核心代码组织 2. 配置文件管理 3. 实验与探索代码 4. 项目产出物管理 三、注意事项 if name "main" 编码格式 类型注解 四、通俗解释 1. 拆分文件和目录:整理房间一样管理代码 2. 导…...
P1152 欢乐的跳
P1152 欢乐的跳 - 洛谷 使用map映射来解 #include<bits/stdc.h> using namespace std; int n,a[1005],c[1005]; map<int,int>b;//因为要记录1~n-1是否都出现了 int main(){cin>>n;cin>>a[1];for(int i2;i<n;i){cin>>a[i];//c[i-1]a[i]-a[…...
基于 STM32 的蔬菜智能育苗系统硬件与软件设计
一、系统总体架构 蔬菜智能育苗系统通过单片机实时采集温湿度、光照等环境数据,根据预设阈值自动控制灌溉、补光、通风等设备,实现育苗环境的智能化管理。系统主要包括以下部分: 主控芯片:STM32F103C8T6(32 位 ARM Cortex-M3 单片机,性价比高,适合嵌入式控制)传感器模…...
数论:数学王国的密码学
在计算机科学的世界里,数论就像是一把神奇的钥匙,能够解开密码学、算法优化、随机数生成等诸多领域的谜题。作为 C 算法小白,今天我就带大家一起走进数论的奇妙世界,探索其中的奥秘。 什么是数论? 数论是纯粹数学的分…...
软考软件评测师——黑盒测试测试方法
以下为优化后的博客内容: 软件测试方法论精要 第一部分 核心知识点解析 一、等价类划分法 基本概念 将测试对象的输入域划分为若干子集,每个子集选取代表性样本作为测试用例。分为有效等价类(合法输入)和无效等价类࿰…...
python训练 60天挑战-day31
知识点回顾 规范的文件命名规范的文件夹管理机器学习项目的拆分编码格式和类型注解 昨天我们已经介绍了如何在不同的文件中,导入其他目录的文件,核心在于了解导入方式和python解释器检索目录的方式。 搞清楚了这些,那我们就可以来看看&#x…...
2025年电工杯新规发布-近三年题目以及命题趋势
电工杯将于2025.5.23 周五早八正式开赛,该竞赛作为上半年度竞赛规模最大的竞赛,因免报名费、一级学会承办等因素,被众多高校认可。本文将在从2025年竞赛新规、历史赛题选题分析、近年优秀论文分享、竞赛模板分析等进行电工杯备赛,…...
四元数中 w xyz 的含义及应用
四元数是一种用于表示三维空间中旋转的数学工具,形式通常为 qwxiyjzk,其中w 是实部,x,y,z 是虚部。它们的含义如下: 1. w(实部) 2. x,y,z(虚部/向量部分) 3. 单位四元数的条件 四元…...
CSS 样式表的四种应用方式详解以及css注释的应用
一、外部 CSS(推荐方式) 定义:将 CSS 代码保存为独立的 .css 文件,通过 <link> 标签引入 HTML。 优点: 实现内容与样式完全分离多个页面可共享同一 CSS 文件浏览器可缓存 CSS 文件,提升加载速度 …...
IntentUri页面跳转
android browser支持支持Intent Scheme URL语法的可以在wrap页面加载或点击时,通过特定的intent uri链接可以打开对应app页面,例如 <a href"intent://whatsapp/#Intent;schememyapp;packagecom.xiaoyu.myapp;S.help_urlhttp://Fzxing.org;end&qu…...