組み込みロジックプログラミング言語を実装せずに、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
のような別の検索手順を書く必要があります。そして、これは相当量の定型コードを意味します。検索の両方を実行し、値を返す、かなり記法を乱用する
find(p,xs,z) = x ∈ xs & y ∈ xs & x =/= y & f x y =:= g x y =:= z
:もちろん、狭窄または解像度エンジンた器具Curry
又はProlog
ような言語は、プログラマのような文を書くことを可能にします。この問題は、形式的に指定されたアルゴリズムを実装するときに頻繁に発生し、多くの場合、fmap
,foldr
、およびmapAccum
などの関数の組み合わせによって解決されますが、ほとんどは明示的な再帰です。 Haskellでもっと一般的で効率的な、あるいは一般的で表現力豊かなコードを書く方法はありますか?
私は、http://hackage.haskell.org/package/logictがあなたが探しているものと思っています。 –