- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对 lambda 演算中的自然数有如下定义,这是我的主要目标。
-- Apply a function n times on x
apply = \f -> \n -> \x -> foldr ($) x $ replicate n f
-- Church numbers
churchZero = \f -> id
churchOne = \f -> \x -> apply f 1 x
churchTwo = \f -> \x -> apply f 2 x
churchNatural = \n -> \f -> \x -> apply f n x
然后,下一步是定义运算符 churchSum
、churchMul
和 churchExp
。
churchSum = \n -> \m -> \f -> \x -> n f (m f x)
churchMul = \n -> \m -> \f -> \x -> n (m f) x
churchExp = \n -> \m -> n m
很好,它有效,前两个函数“很容易”推导出来,但取幂却不是。至少对我来说。为了了解更多,我对 lambda 项进行了 beta 归一化:
(λf.λx.f(f x))(λf.λx f(f x))
看看实际上,求幂是正确的。
所以,我的问题是:我如何在不知道它的情况下推导出这个求幂的 lambda 项?甚至,当类型为 λ> churchTwo::(b -> b) -> b -> b
?在里面做函数的 beta 归一化?
最佳答案
你的 exp
有点倒退:
((\f x -> f$f$f$x) `exp` (\f x -> f$f$x)) (+1) 0 == 8
-- 3 ^ 2 = 8???
-- But 2^3 = 8
正确的(-er-ish)版本是
exp n m = m n
((\f x -> f$f$f$x) `exp` (\f x -> f$f$x)) (+1) 0 == 9
-- 3 ^ 2 = 9
因为它保持着熟悉的秩序。这并不真正影响您如何定义 exp
。 .
指数是重复乘法:n<sup>m</sup>
是n
自相乘m
次。教堂数字表示函数对值的重复应用。所以,churchMul n
是一个将数字乘以 n
的函数, m
是重复函数 m
的函数次,和churchOne
是基值(乘法恒等式)。将它们放在一起,然后简化:
-- n^m is the repeated multiplication of 1 by n, m times
exp n m = m (churchMul n) churchOne
-- expand definitions x2; simplify churchOne
exp n m = m (\o f x -> n (o f) x) (\f x -> f x)
-- eta contract x2
exp n m = m (\o f -> n (o f)) (\f -> f)
-- definition of (.), id
exp n m = m (\o -> n . o) id
-- eta contract
exp n m = m (n .) id
-- eta expand
exp n m f = m (n .) id f
-- Assume m has the type forall b. (b -> b) -> b -> b
-- This assumption may actually be false here, because the implicit type of exp
-- does not require that m, n have that type. The difference is that you could define
-- bogus _ _ _ = 0
-- (which isn't a church numeral) and still pass it to exp, which would no longer
-- act like exponentiation:
-- exp n bogus = bogus (n .) id = const 0
-- which also isn't a church numeral
-- Polymorphic functions like m give rise to theorems that can be derived
-- entirely from their types. I used http://www-ps.iai.uni-bonn.de/cgi-bin/free-theorems-webui.cgi
-- to get this one automatically.
-- Free theorem of the type of m
forall a b (g :: a -> b) (p :: a -> a) (q :: b -> b).
(forall (x :: a). g (p x) = q (g x)) ->
(forall (y :: a). g (m p y) = m q (g y))
-- Instantiate g = ($ f), p = (n .), q = n, y = id
(forall x. (n . x) f = n (x f)) -> (m (n .) id f = m n f)
-- definition of (.)
(n . x) f = n (x f)
-- so...
m (n .) id f = m n f
-- transitive property
exp n m f = m n f
-- eta contract
exp n m = m n
上面的东西与m
的自由定理实际上是以下论证的严格版本(这可能更好地转化为无类型的 lambda 演算):
-- m, being a valid numeral, is of the form
m f x = f $ f $ ... $ f $ f $ x
m (n .) id = (n .) $ (n .) $ ... $ (n .) $ (n .) $ id
= (n .) $ (n .) $ ... $ (n .) $ n . id
= (n .) $ (n .) $ ... $ (n .) $ n
= (n .) $ (n .) $ ... $ n . n
...
= n . n . ... . n . n
-- so
m n = n . n . ... . n . n = m (n .) id
至于为什么churchTwo churchTwo
类型检查,请注意该表达式中的每个事件都有不同的类型,因为 churchTwo
是多态的,描述了一整套函数,而不仅仅是一个函数。
-- most general type
churchTwo :: forall b. (b -> b) -> (b -> b)
-- Each occurrence of churchTwo can have a different type, so let's give them
-- different names.
-- I'm using underscores because these variables haven't been solved yet
churchTwo0 :: (_b0 -> _b0) -> (_b0 -> _b0)
churchTwo1 :: (_b1 -> _b1) -> (_b1 -> _b1)
churchTwo0 churchTwo1 :: _
-- Since churchTwo0 is being applied, the whole expression must have the
-- type on the right of the arrow
churchTwo0 churchTwo1 :: _b0 -> _b0
-- Since churchTwo0 is being applied to churchTwo1, the left side of the
-- top level arrow in churchTwo0 must be equal to the type of churchTwo1
(_b0 -> _b0) ~ ((_b1 -> _b1) -> (_b1 -> _b1))
-- Therefore...
(_b0 ~ (_b1 -> _b1))
churchTwo0 churchTwo1 :: (_b1 -> _b1) -> (_b1 -> _b1)
-- That's all the constraints we have, so replace the free variables
-- with universally quantified ones
chuchTwo0 churchTwo1 :: forall b. (b -> b) -> (b -> b)
-- (which is the type of a numeral)
关于haskell - Church naturals、求幂函数和类型检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47563925/
我在编写数学函数时遇到了麻烦。它应该接受 3 个变量并像这样计算方程。 答案 = x(1 + y/100)^ z 我把它写成: public compute_cert (int years, doub
我正在开发一个计算器,以便更好地学习 Java。我编写了自己的代码来使用 BigDecimal 参数计算幂。截至目前,代码无法处理分数幂,例如 2^2.2。为了解决这个问题,我想在我的代码中实现指数恒
我正在寻找一种算法(或者更好的是,代码!)来生成幂,特别是奇数指数大于 1 的数字:三次幂、五次幂、七次幂等等。然后我想要的输出是 8, 27, 32, 125, 128, 216, 243, 343
在 Codewars 上找到这个。该函数接受两个参数 A 和 B,并返回 A^B 的最后一位。下面的代码通过了前两个测试用例,但不会通过下一个测试用例。 def last_digit(n1, n2):
像 2^(2%1) 这样的表达式在 GHCi 中不会进行类型检查,并且错误消息是神秘的。为什么这不起作用,我需要改变什么? 我无法转换为其他类型,我希望将其用于 27^(1%3) 等表达式。 最佳答案
我的二次幂没有达到应有的水平,所以我想也许我可以 #define 做点什么。 不幸的是,我在预处理器指令方面经验不足,我不知道如何做 for 循环之类的事情。我看了看: http://www.cplu
如何在 Math.net 中获得三角函数的幂? Expr x = Expr.Variable("x"); Expr g = (2 * x).Sinh().Pow(2); g.ToString()给出输
我正在尝试拟合这个渐近接近零(但从未达到它)的数据。 我相信最好的曲线是逆逻辑函数,但欢迎建议。关键是预期的衰减“S 曲线”形状。 这是我到目前为止的代码,以及下面的绘图图像,这是一个非常丑陋的适合。
这个问题在这里已经有了答案: The most efficient way to implement an integer based power function pow(int, int) (2
我试图获得指数非常大的 double 值的幂(Java BigInteger 可以包含它(指数),例如:10^30 ) 也就是说,我想找到类似 1.75^(10^30) 或 1.23^(3423453
我有一个数学表达式,例如: ((2-x+3)^2+(x-5+7)^10)^0.5 我需要更换 ^符号到pow C语言的功能。我认为正则表达式是我需要的,但我不知道像专业人士那样的正则表达式。所以我最终
这是我的 previous question on bit flags 的后续内容,我澄清了一些重大误解。 我需要创建这些函数来查找包含零个或多个标志的 int 中的单个位标志: BitBinaryU
我已经在 java 中为 BigInteger 尝试过 modPow() 函数。 但它需要太长时间。 我知道模乘法,甚至也知道求幂。 但由于条件限制,我无法解决这个问题。 a、b 的值可以包含 100
我是一名优秀的程序员,十分优秀!