【发布时间】:2014-08-04 01:30:09
【问题描述】:
假设我有这三个谓词:
Predicate<int> pred1 = x => x > 0;
Predicate<int> pred2 = x => x > 0 && true;
Predicate<int> pred3 = x => false;
从人类的角度来看,说pred1 和pred2 是等价的,而pred3 不是。等价是指对于每个可能的输入值,pred1 和 pred2 输出的值都是相同的。
我想计算给定谓词的唯一哈希;两个等价的谓词应该有相同的哈希值(如pred1 和pred2),两个不等价的谓词不应该有(如pred1 和pred3)。
以前是否已经做过(同样,使用 .NET 语言)?我知道副作用基本上是这种分析的祸根;但是如果我们“禁止”副作用,它可以在 .NET 中(迅速)完成吗?
满足此要求的最佳方法是什么?
【问题讨论】:
-
欢迎来到停机问题的精彩世界。祝你好运。
-
正如 slacks 所暗示的,这在一般情况下被证明是不可能的。您可以期望的最好结果是具有一些误报/误报的近似值。
-
@SLaks - 相反,停止问题不适用于此处(假设纯谓词,如问题陈述中所述) - 您可以对所有
int值运行每个谓词并检查如果答案总是相同的,那么它是可判定的。当然,有 2^(2^32) 个可能的谓词这一事实意味着您不会找到始终分隔不同谓词的哈希。 -
取决于您是否将不终止视为副作用:-)。如果没有副作用包括没有非终止,那么它肯定(理论上)是可行的。
-
@Servy - 也许我应该说“total”而不是“pure”以避免争议,但许多人确实将不终止视为一种杂质。从库里霍华德的角度来看,偏心导致任何事情都可以证明的逻辑。
标签: c# .net f# functional-programming dynamic-analysis