Mai*_*tor 71 lisp lambda haskell functional-programming clojure
有没有办法比较两个函数的相等性?例如,(?x.2*x) == (?x.x+x)应该返回true,因为那些显然是等价的.
Dan*_*ner 124
众所周知,一般的函数相等性一般是不可判定的,因此您必须选择您感兴趣的问题的一个子集.您可以考虑以下部分解决方案:
ali*_*ias 42
这通常是不可判定的,但是对于合适的子集,您今天确实可以使用SMT求解器有效地完成它:
$ ghci
GHCi, version 8.0.1: http://www.haskell.org/ghc/ :? for help
Prelude> :m Data.SBV
Prelude Data.SBV> (\x -> 2 * x) === (\x -> x + x :: SInteger)
Q.E.D.
Prelude Data.SBV> (\x -> 2 * x) === (\x -> 1 + x + x :: SInteger)
Falsifiable. Counter-example:
s0 = 0 :: Integer
Run Code Online (Sandbox Code Playgroud)
有关详细信息,请参阅:https://hackage.haskell.org/package/sbv
luk*_*afi 11
除了在另一个答案中给出的实际例子之外,让我们选择在类型化的lambda演算中可表达的函数子集; 我们还可以允许产品和总和类型.虽然检查两个函数是否相等可以简单到将它们应用于变量并比较结果,但我们无法在编程语言本身内构建相等函数.
ETA:λProlog是一种用于操作(类型化的lambda演算)函数的逻辑编程语言.
2年过去了,但我想对这个问题加一点评论.最初,我问是否有任何方法可以判断是否(?x.2*x)等于(?x.x+x).λ演算的加法和乘法可以定义为:
add = (a b c -> (a b (a b c)))
mul = (a b c -> (a (b c)))
Run Code Online (Sandbox Code Playgroud)
现在,如果您规范化以下术语:
add_x_x = (?x . (add x x))
mul_x_2 = (mul (?f x . (f (f x)))
Run Code Online (Sandbox Code Playgroud)
你得到:
result = (a b c -> (a b (a b c)))
Run Code Online (Sandbox Code Playgroud)
对于这两个项目.由于它们的正常形式相同,因此两个程序显然是相等的.虽然这在一般情况下不起作用,但它在实践中确实适用于许多术语.(?x.(mul 2 (mul 3 x))例如,(?x.(mul 6 x))两者都具有相同的正常形式.
| 归档时间: |
|
| 查看次数: |
21163 次 |
| 最近记录: |