类型对Mercury等逻辑编程语言有什么好处?

时间:2014-04-11 10:51:04

标签: types logic first-order-logic mercury

我开始看Mercury语言,这看起来非常有趣。我是逻辑编程的新手,但在Scala和Haskell中使用函数式编程非常有经验。我一直在思考的一件事是,当你已经有一个至少与类型一样具有表现力的谓词时,为什么你需要逻辑编程中的类型。

例如,在以下代码段中使用类型有什么好处(取自Mercury教程):

:- type list(T) ---> [] ; [T | list(T)].

:- pred fib(int::in, int::out) is det.
fib(N, X) :-
  ( if N =< 2
  then X = 1
  else fib(N - 1, A), fib(N - 2, B), X = A + B
  ).

与仅使用谓词编写它相比:

list(T, []).
list(T, [H | X]) :- T(H), list(T, X).

int(X) :- .... (builtin predicate)

fib(N, X) :-
  int(N),
  int(X),
  ( if N =< 2
  then X = 1
  else fib(N - 1, A), fib(N - 2, B), X = A + B
  ).

随意指出涵盖此主题的介绍性材料。

编辑: 在提出问题时我可能有点不清楚。实际上,在查看像Idris这样的依赖类型语言之后,我开始关注Mercury,并且在依赖类型中可以使用类型中的值,就像在编译时可以使用谓词来验证逻辑程序的正确性一样。如果程序需要花费很长时间来评估,那么我可以看到使用类型编译时性能的好处(但只有当类型不如&#34;实现&#34时那么复杂;在讨论时不一定是这种情况依赖打字)。我的问题是除了编译时间性能之外,使用类型还有其他好处。

1 个答案:

答案 0 :(得分:4)

与您的替代方案相比,一个直接的好处是声明,如

:- pred fib(int::in, int::out) is det.

可以与该子句分开放入模块的接口。这样,模块的用户可以获得有关fib谓词的经过编译器验证的建设性信息,而不会暴露给实现细节。

更一般地说,Mercury的类型系统是静态可判定的。这意味着它的表达严格程度低于使用谓词,但好处是代码的作者确切地知道在编译时会捕获哪些错误。用户当然还可以使用谓词添加运行时检查,以涵盖类型系统无法捕获的情况。

Mercury支持类型推断,因此依赖类型会遇到与谓词相关的静态检查问题。有关信息和更多链接,请参阅this answer