내장 된 논리 프로그래밍 언어를 구현하지 않고 하스켈에 존재 진술을 작성하는 확장 가능하고 효율적인 방법이 있습니까? 내가 알고리즘을 구현있을 때 때때로, 나는 ∈
이 목록에 오버로드존재감없는 검색과 질의
∃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]
같습니다 그러나이 방법은 쿼리가 여러 arities의 값이나 조건 또는 함수를 반환 잘 일반화하지 않는 명쾌한 코드를 작성할 수 있습니다 . 예를 들어,
∃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
과 같은 함수 조합으로 해결되지만 대개는 명시 적 재귀를 통해 해결됩니다. 하스켈에서 이와 같은 코드를 작성하는보다 일반적이고 효율적인, 또는 일반적이고 표현적인 방법이 있습니까?
http://hackage.haskell.org/package/logict가 귀하가 찾고있는 것으로 의심됩니다. –