输入毫无意义的签名

2024-01-04

Consider

(a->a) -> [a] -> Bool

这个签名有什么有意义的定义吗?也就是说,定义不是简单地忽略论证?

x -> [a] -> Bool

看来这样的签名还有很多,可以立即排除。


Carsten König 在评论中建议使用自由定理。让我们试试吧。

装好大炮

我们从生成自由定理 http://www-ps.iai.uni-bonn.de/cgi-bin/free-theorems-webui.cgi对应类型(a->a) -> [a] -> Bool。这是该类型的每个函数都必须满足的属性,正如著名的 Wadler 论文所确立的那样免费定理! http://ttic.uchicago.edu/~dreyer/course/papers/wadler.pdf.

forall t1,t2 in TYPES, R in REL(t1,t2).
 forall p :: t1 -> t1.
  forall q :: t2 -> t2.
   (forall (x, y) in R. (p x, q y) in R)
   ==> (forall (z, v) in lift{[]}(R). f_{t1} p z = f_{t2} q v)

lift{[]}(R)
  = {([], [])}
  u {(x : xs, y : ys) | ((x, y) in R) && ((xs, ys) in lift{[]}(R))}

一个例子

为了更好地理解上面的定理,让我们看一个具体的例子。要使用该定理,我们需要采用任意两种类型t1,t2,所以我们可以选择t1=Bool and t2=Int.

然后我们需要选择一个函数p :: Bool -> Bool (say p=not) 和一个函数q :: Int -> Int (say q = \x -> 1-x).

现在,我们需要定义一个关系R之间Bools and Ints。让我们采用标准布尔值 整数对应关系,即:

R = {(False,0),(True,1)}

(以上是一一对应的,但一般情况下不一定如此)。

现在我们需要检查一下(forall (x, y) in R. (p x, q y) in R)。我们只有两个案例需要检查(x,y) in R:

Case (x,y) = (False,0): we verify that (not False, 1-0) = (True, 1) in R   (ok!)
Case (x,y) = (True ,1): we verify that (not True , 1-1) = (False,0) in R   (ok!)

到目前为止,一切都很好。现在我们需要“提升”关系以便处理列表:例如

[True,False,False,False] is in relation with [1,0,0,0]

这个扩展关系被命名为lift{[]}(R) above.

最后,定理指出,对于any功能f :: (a->a) -> [a] -> Bool我们必须有

f_Bool not [True,False,False,False] = f_Int (\x->1-x) [1,0,0,0]

上面哪里f_Bool只是明确表示f用于特殊情况,其中a=Bool.

这样做的力量在于我们不知道代码是什么f实际上是。我们正在推论什么f必须仅通过查看其多态类型来满足。

由于我们从类型推断中获得类型,并且我们可以将类型转化为定理,因此我们真正获得了“免费定理!”。

回到最初的目标

我们想证明这一点f不使用它的第一个参数,并且它也不关心它的第二个列表参数,除了它的长度。

为此,采取R是普遍正确的关系。然后,lift{[]}(R)是一种关系,如果两个列表具有相同的长度,则将它们关联起来。

该定理意味着:

forall t1,t2 in TYPES.
 forall p :: t1 -> t1.
  forall q :: t2 -> t2.
   forall z :: [t1].
    forall v :: [t2].
     length z = length v ==> f_{t1} p z = f_{t2} q v

Hence, f忽略第一个参数,只关心第二个参数的长度。

QED

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

输入毫无意义的签名 的相关文章

随机推荐

  • 任何人都可以翻译 X12 271 医疗保健回复 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找 C 代码 将 271 医疗保健资格福利响应转换为更可用的格式 以便我可以将某些段和值显示到
  • 未找到资源绘图

    当我在手机上安装应用程序时 它立即崩溃 告诉我找不到可绘制对象 Resource com aaronapp hideme drawable ic clear 7f07007a is not a Drawable color or path
  • 如何在没有 php Artisan 服务的情况下查看 laravel 视图

    我怎样才能看到Laravel无需 artisan 命令即可查看CLI 我没有CLI从我的托管提供商处 我只能访问FTP 跑步Laravel我必须使用这个命令CLI php artisan serve port 8080 host 0 0 0
  • 如何从多个进程中拆分和重新加入 STDOUT?

    我正在开发一个管道 该管道有几个随后合并的分支点 它们看起来像这样 command2 command1 command4 command3 每个命令写入 STDOUT 并通过 STDIN 接受输入 来自 command1 的 STDOUT
  • 如何将长日期值转换为 mm/dd/yyyy 格式[重复]

    这个问题在这里已经有答案了 可能的重复 将长字符串转换为日期 https stackoverflow com questions 11753341 converting long string to date 我需要转换long日期值至月
  • 如何对应用程序状态建模?

    我正在编写一个游戏 我想以一种干净的 面向对象的方式对其不同的状态进行建模 我猜 Game Maker 的类比是框架 以前 我是通过以下方式完成的 class Game enum AppStates APP STARTING APP TIT
  • SQL Server 数据库迁移向导发生了什么?

    SQL Server 数据库迁移向导 又名 SQL Azure 迁移向导 以前位于http sqlazuremw codeplex com http sqlazuremw codeplex com 但已经消失了 我试图通过谷歌搜索它的新家
  • 未找到带标签的句柄可放入图例折线图中

    我正在使用 matplotlib 绘制折线图 在所有其他情况下 它通常会自动检测图例 但这次我使用数据透视表来绘制图表 我认为这会阻止它 我不确定如何绘制图例 No handles with labels found to put in l
  • GWT + 流程构建器

    是否可以将 ProcessBuilder 与 GWT 一起使用 当我声明一个新 ProcessBuilder 的实例时 我得到 java lang ProcessBuilder is not supported by Google App
  • 将 .Glade(或 xml)文件转换为 C 源代码的工具

    我正在寻找可以将 Glade 或 xml 文件转换为 C 源代码的工具 我尝试过 g2c Glade To C Translator 但我正在寻找 Windows 二进制文件 任何人都知道有什么好的窗口工具 Thanks PP 你不需要工具
  • Firebase 存储下载我上传的原始文本,而不仅仅是网址

    我上传了一个原始的String使用提供的示例对 firebase 存储进行 测试 here https firebase google com docs storage web upload files upload from a stri
  • DatePicker 的 setMinDate() [重复]

    这个问题在这里已经有答案了 我在几个地方看到了有关堆栈溢出的这个问题 但给出的答案对我不起作用 所以我在这里 我需要将日期选择器的最小日期动态设置为当前日期 我的最低 API 是 12 我试过这个 Calendar minCalendar
  • 如何阻止一个节点上的死锁导致整个集群崩溃?

    我正在 MariaDB 下运行 3x 节点 Galera 集群 该应用程序采用 PHP 语言 使用 mysqli 扩展 偶尔我会得到一个Deadlock https dev mysql com doc refman 5 5 en error
  • 使用 javascript 更改图像不透明度

    如何使用 javascript 更改图像不透明度 我将使用 javascript 创建淡入淡出效果 有示例吗 有没有像 image opacity 这样的东西可以通过 JS 代码更改 它是如何设置的 thanks 假设您使用纯 JS 请参阅
  • Spring @Autowire 关于属性与构造函数

    因此 由于我一直在使用 Spring 如果我要编写一个具有依赖项的服务 我将执行以下操作 Component public class SomeService Autowired private SomeOtherService someO
  • 如何获取网页的最后修改日期? [复制]

    这个问题在这里已经有答案了 我想知道如何使用 C 获取网页的最后修改日期 我尝试了下面的代码 但我只得到今天的日期 HttpWebRequest req HttpWebRequest WebRequest Create http www c
  • React 开发工具中组件的forwardRef 是什么意思以及如何使用它?

    当我在 React 开发工具中检查组件结构时 我可以看到有一个forwardRef标记 我很困惑 因为源代码中没有使用它的迹象 它是怎么存在的以及我该如何使用它 The forwardRef调用不在您自己的代码中 它们在您正在使用的包中 s
  • 输入毫无意义的签名

    Consider a gt a gt a gt Bool 这个签名有什么有意义的定义吗 也就是说 定义不是简单地忽略论证 x gt a gt Bool 看来这样的签名还有很多 可以立即排除 Carsten K nig 在评论中建议使用自由定