prolog, mercury를 좀 찾아봤는데

그냥 prolog는 좀 골때리는 면이 있음.
내가 느낀 문제는, pred(X,Y) 가 있다고 하면
pred(x,y) 처럼 쓰면 pred에 x, y를 인자로 넘겼을 때 진리값을 찾는거고
pred(x,Y) 처럼 쓰면 pred를 만족시키는 Y들을 찾는거거든. (Y가 자유 변수일때)

근데 이게 pred의 구현에 따라서 둘다 가능할 수도 있고 전자만 가능할 수도 있는데, 이걸 구별해주는 문법이 없음.
(그래서 프롤로그는 보통 문서 만들때 어떤식으로 작동하는지 기술해주는듯)

mercury는 변수가 in인지 out인지를 선언해서 올바르지 않은 코드는 거부할 수가 있음. 저번에 다른 갤러가 올린글에서 언급된 것처럼, in/out에 해당하지 않는 경우는 전부 거부해버리는 문제가 있다는 것 같기는 하더라. '현재'라고 표현한걸 보면 개선 의지가 있는듯.

다른 차이로, 머큐리는 타입과 함수가 있는데, prolog에서도 +연산자 같은건 결국 함수라서 걍 머큐리처럼 함수를 정의할 수 있는게 좋은것 같음.
머큐리 타입 시스템은 하스켈하고 거의 같은데, 하스켈 Typeable에 해당하는걸 그냥 줘버림 (그래서 RTTI도 있음). 개인적으로 불호인 부분.
대신 uniqueness type도 있는데, 이건 나쁘지 않을듯.

뭐 하스켈 안해본 사람이면 모르겠는데, 하스켈 해본 사람이면 프롤롤로그 제끼고 바로 머큐리 해도 될것 같음.

대충
FP = Lisp | Haskell
LP = Prolog | Mercury
map :: FP -> LP
map Lisp = Prolog
map Haskell = Mercury

이런 느낌임 ㅇㅅㅇ


역사적인 포지션으로 보나, 언어 철학으로 보나 이런 관계라고 생각됨.

+
또 프롤롤로그 ㅈ같은게, 선언 조무사임.
p(X,Y), q(X,Y) 랑 q(X,Y), p(X,Y) 의 결과가 다를 수 있고, 심지어
p(X,Y)랑 p(X,Z), Z=Y 도 다를 수가 있음.

머큐리도 이런지는 아직 잘 모르겠음.