【发布时间】:2011-12-10 10:50:32
【问题描述】:
有没有一种可扩展的、有效的方法来在 Haskell 中编写存在性语句而无需实现嵌入式逻辑编程语言?通常,当我在实现算法时,我想表达存在量化的一阶陈述,例如
∃x.∃y.x,y ∈ xs ∧ x ≠ y ∧ p x y
∈ 在列表中被重载。如果我赶时间,我可能会写出看起来像这样的明显代码
find p [] = False
find p (x:xs) = any (\y -> x /= y && (p x y || p y x)) xs || find p xs
或
find p xs = or [ x /= y && (p x y || p y x) | x <- xs, y <- xs]
但是这种方法不能很好地推广到返回值或谓词或多个参数的函数的查询。例如,即使是像
这样的简单语句∃x.∃y.x,y,z ∈ xs ∧ x ≠ y ≠ z ∧ f x y z = g x y z
需要编写另一个搜索过程。这意味着大量的样板代码。当然,像 Curry 或 Prolog 这样实现缩小或解析引擎的语言允许程序员编写如下语句:
find(p,xs,z) = x ∈ xs & y ∈ xs & x =/= y & f x y =:= g x y =:= z
大量滥用该表示法,它执行搜索并返回一个值。这个问题在实现正式指定的算法时经常出现,通常通过fmap、foldr和mapAccum等函数的组合来解决,但主要是显式递归。有没有更通用、更高效,或者只是通用和表达性更强的方法来用 Haskell 编写这样的代码?
【问题讨论】:
-
我怀疑hackage.haskell.org/package/logict 是你要找的。span>
标签: algorithm search haskell logic