【发布时间】:2014-05-25 11:43:12
【问题描述】:
我开始研究 Mercury 语言,这似乎很有趣。我是逻辑编程的新手,但对 Scala 和 Haskell 的函数式编程非常有经验。我一直在思考的一件事是,当您已经拥有至少应该与类型一样具有表达力的谓词时,为什么在逻辑编程中还需要类型。
例如,在以下 sn-p 中使用类型有什么好处(取自 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 的,就像在依赖类型中可以在类型中使用值一样,也可以在编译时使用谓词来验证逻辑程序的正确性。如果程序需要很长时间来评估,我可以看到出于编译时性能原因使用类型的好处(但前提是类型不如“实现”复杂,在谈论依赖类型时不一定是这种情况)。我的问题是除了编译时性能之外,使用类型是否还有其他好处。
【问题讨论】:
-
您是说逻辑编程语言中的运行时类型断言比函数式或过程语言中的运行时类型断言更能替代静态类型吗?
-
不,我有点不清楚,请参阅我对问题的编辑。
-
我认为我正在寻找一种具有自动定理证明的语言,例如 Why3 或 Astrée。缺点是这些解决方案(如 SMT 求解器)是有限的和/或不可预测的,而类型系统是健壮的(但也是有限的)。不过,这似乎是一个活跃的研究领域,甚至还有一些项目使用 SMT 求解器扩展 Haskell。
标签: types logic first-order-logic mercury