是否有可能构造一个更高阶函数isAssociative,它接受两个参数的另一个函数并确定该函数是否是关联的?
类似的问题,但对于其他属性,如交换性.
如果这是不可能的,有没有办法用任何语言自动化它?如果有我感兴趣的Agda,Coq或Prolog解决方案.
我可以设想一个强力解决方案,它检查每个可能的参数组合,永远不会终止.但在这种情况下,"永不终止"是一种不受欢迎的财产.
haskell halting-problem associativity higher-order-functions commutativity
我并没有深入根植于静态代码分析的正式方面,因此这个问题.
几年前,我读到使用静态代码分析区分代码和数据等同于暂停问题.(引用需要,但我不再拥有它了.Stackoverflow在这里或这里有线程.)至少对于基于冯诺依曼架构的常见计算机架构,其中代码和数据共享相同的内存,这似乎是有意义的.
现在我正在研究C/C++代码和指针分析的静态分析; 该程序不执行.不知怎的,我有一种感觉,静态跟踪指针值的所有创建和使用类似于停止问题,因为我无法确定内存中的给定值是否是指针值,即我无法通过指针值跟踪指针值的值记忆. 别名分析可能会缩小问题范围,但面对多线程代码似乎变得不那么有用了.
(人们甚至可以考虑跟踪任意值,而不仅仅是指针:为任何给定的"有趣"值构建一个完整的值流似乎等同于停止问题.)
由于这只是一种预感,我的问题是:我可以参考更正式的发现吗?我错了吗?
因为Nothing >>= f = Nothing对于每一个f,以下微不足道的定义适用于mfix:
mfix _ = Nothing
Run Code Online (Sandbox Code Playgroud)
但这没有实际用途,因此我们有以下非全面定义:
mfix f = let a = f (unJust a) in a where
unJust (Just x) = x
unJust Nothing = errorWithoutStackTrace "mfix Maybe: Nothing"
Run Code Online (Sandbox Code Playgroud)
如果这个-clause不会停止,那么mfix f返回会很好.(例如,)
这是不可能的,因为暂停问题无法解决?Nothingletf = Just . (1+)
众所周知,暂停问题不能有一个明确的解决方案,一个是a)返回true <==>程序确实停止了,b)处理任何输入,但我想知道是否有足够好的解决方案来解决问题,那些可以完美地处理某些类型的程序流程,或者能够识别何时无法正确解决问题,或者能够正确地解决问题,等等......
如果是这样,他们有多好,他们依赖什么想法/限制?
这里有很多关于SO的相关问题,但他们都要求编写一个程序来计算任意算法的复杂性(这显然是不可判定的).我愿意对输入做出以下限制:
问题是,是否可以编写程序来通过静态分析来计算这种算法的时间复杂度?如果输入算法未终止,则程序行为未定义(可能会崩溃,返回谎言或无法终止).
big-o computer-science code-analysis halting-problem time-complexity
当我第一次阅读严肃的批评时-XUndecidableInstances,我已经完全习惯了它,将其视为仅仅删除了令人讨厌的限制Haskell98必须使编译器更容易实现.
事实上,我遇到了大量需要不可判定实例的应用程序,但没有一处它们实际上导致任何与不可判定性相关的问题.卢克的例子存在问题,原因完全不同
class Group g where
(%) :: g -> g -> g
...
instance Num g => Group g where
...
Run Code Online (Sandbox Code Playgroud)
- 好吧,这显然会被任何适当的实例重叠Group,所以不可判断性是我们最不担心的事情:这实际上是不确定的!
但公平地说,我自己保留了"不可判断的实例可能会让编译器挂起".
当我在CodeGolf.SE上阅读这个挑战时获得它,请求代码无限地挂起编译器.嗯,听起来像是不可判断的实例的工作,对吧?
事实证明我无法让他们这样做.以下编译,至少从GHC-7.10开始:
{-# LANGUAGE FlexibleInstances, UndecidableInstances #-}
class C y
instance C y => C y
main = return ()
Run Code Online (Sandbox Code Playgroud)
我甚至可以使用类方法,它们只会在运行时引起循环:
{-# LANGUAGE FlexibleInstances, UndecidableInstances #-}
class C y where y::y
instance C y => C y …Run Code Online (Sandbox Code Playgroud) 我注意到,我的控制器的"索引"动作被调用了两次.
该行动具有以下结构:
def index
if params[:tags].nil?
# [fork #1] just return the whole collection of model
@items = Item.all
else
# [fork #2] filter items by tags
@items = Item.select_by_tags params[:tags]
end
# Another operations with @items
# The result will be incorrect, because, when tags in params are specified,
# controller action will be first executed for fork #2, and then for fork #1.
# In view, i get @items from fork #2 and result of THIS piece of …Run Code Online (Sandbox Code Playgroud) 出于好奇,我来写下面的方法:
public Object getObject() {
return this.getObject();
}
Run Code Online (Sandbox Code Playgroud)
为什么Java允许我写这个?这种方法永远不会返回任何Object并导致a StackOverflow Error.