isabelle - 在 Isabelle 中使用 simprocs 重写正弦
问题描述
我想实现一个能够将 sin 的参数重写为线性组合 x + k * pi + k' * pi / 2 的 simproc (理想情况下 k' = 0 或 k' = 1),然后应用现有的关于添加的引理正弦参数。
步骤如下:
- 模式匹配目标以提取 sin(expr) 的参数:
fun dest_sine t =
case t of
(@{term "(sin):: real ⇒ real"} $ t') => t'
| _ => raise TERM ("dest_sine", [t]) ;
证明对于某些 x、k、k':expr = x + k*pi + k' * pi/2。
使用现有的引理重写为更简单的三角函数:
fun rewriter x k k' =
if (k mod 2 = 0 andalso k' = 0) then @{term "sin"} $ x
else if (k mod 2 = 0 andalso k' = 1) then @{term "cos"} $ x
else if (k mod 2 = 1 andalso k' = 0) then @{term "-sin"} $ x
else @{term "-cos"} $ x
我被困在第二步。这个想法是使用代数简化来获得定理成立的 x,k,k'。我相信原理图目标应该这样做,但我从未使用过它们。
我的想法
我是否可以假设表达式是这种形式并让简化器找到它以便可以触发 simproc?
如果我首先开始假设线性形式 x + k*pi + k' * pi/2 那么:
- 从此组合中提取 x,k,k'。
- 应用重写器,得到对应的要重写的词条两个。
- 依次应用:规则处理+ pi/2,规则处理+ 2 pi
解决方案
推荐阅读
- python - Python 请求 GET 未获取 JSON 有效负载?
- python - 使用“for”循环和“if”语句加速 Python Lemmatizer
- oracle - oracle PL/SQL 如何确定 IPv6-Address 是否在 IPv6Range 中
- msbuild - MSBuild 16.9 .NET Core 3.1 - OutDir 不搜索依赖项
- javascript - 如何在 Chart.js 中显示 1 个项目的多年数据?
- flutter - 一个用户如何查看另一个用户之前输入的数据?
- jsf - 如何将 primeface 列包含到组合中
- jquery - 如何在 ember v3.2.5 中使用 jQuery AJAX?
- unity3d - 对象从新场景 Unity 的层次结构中消失
- reactjs - 如何使用 gh-pages 在 root 中部署包含子目录的 React 项目?