Types 类型给Mercury这样的逻辑编程语言带来了什么好处?

Types 类型给Mercury这样的逻辑编程语言带来了什么好处?,types,logic,first-order-logic,mercury,Types,Logic,First Order Logic,Mercury,我开始研究Mercury语言,它看起来很有趣。我是逻辑编程新手,但对Scala和Haskell中的函数编程非常有经验。我一直在思考的一件事是,为什么在逻辑编程中需要类型,而谓词至少应该和类型一样具有表现力 例如,在以下代码段中使用类型有什么好处(摘自Mercury教程): :-类型列表(T)--->[];[T |列表(T)]。 :-pred fib(int::in,int::out)是det。 fib(N,X):- (如果N=存在X.(int(X)&fib(N,X))。也许这就是水星类型系统中对

我开始研究Mercury语言,它看起来很有趣。我是逻辑编程新手,但对Scala和Haskell中的函数编程非常有经验。我一直在思考的一件事是,为什么在逻辑编程中需要类型,而谓词至少应该和类型一样具有表现力

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

:-类型列表(T)--->[];[T |列表(T)]。
:-pred fib(int::in,int::out)是det。
fib(N,X):-
(如果N=<2
那么X=1
否则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
  ).
list(T,[])。
列表(T[H | X]):-T(H),列表(T,X)。
int(X):-。。。。(内置谓词)
fib(N,X):-
int(N),
int(X),
(如果N=<2
那么X=1
否则fib(N-1,A),fib(N-2,B),X=A+B
).
请随意指向涵盖此主题的介绍性材料

编辑:
我可能对这个问题的表述有点不清楚。实际上,我是在研究了像Idris这样的依赖类型语言之后才开始研究Mercury的,就像在依赖类型中使用值一样,在编译时也可以使用谓词来验证逻辑程序的正确性。如果程序需要很长时间进行评估(但仅当类型没有“实现”复杂时,而“实现”在谈论依赖类型时不一定如此),那么出于编译时性能原因,我可以看到使用类型的好处。我的问题是,除了编译时性能之外,使用类型是否还有其他好处

:- pred fib(int::in, int::out) is det.
可以与子句分开放在模块接口中。这样,模块的用户就可以获得有关
fib
谓词的构造性、编译器验证的信息,而不必暴露于实现细节

更一般地说,水星型系统是静态可判定的。这意味着它的表达能力比使用谓词要差得多,但好处是代码的作者确切地知道在编译时将捕获哪些错误。当然,用户仍然可以使用谓词添加运行时检查,以覆盖类型系统无法捕获的情况


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

您是说逻辑编程语言中的运行时类型断言在某种程度上比函数式或过程式语言中的运行时类型断言更好地替代静态类型吗?不,我有点不清楚,请看我对这个问题的编辑。我想我要找的是一种自动定理证明的语言,比如Why3或Astrée。缺点是这些解决方案(如SMT解算器)是有限的和/或不可预测的,而类型系统是健壮的(但也有限)。不过,这似乎是一个活跃的研究领域,甚至有一些项目将Haskell与SMT解决方案进行了扩展。感谢您的回复。关于你的第一个论点,在我看来,在接口中也可以用蕴涵替换类型(在本例中,
fib(N,X):-int(N),int(X)
)。@jespernodenberg,蕴涵是错误的——你的意思是说如果fib(N,X)为真,那么N和X是整数。但是是的,可以按照你的建议去做。问题是,这是否可取?从语言设计的角度来看,模块的作者表现力越强,用户就越复杂。是的,隐含的方向很有趣。在函数式语言中,
fib
的类型为
(N:Int)->(X:Int)
,这意味着你可以给
fib
任何
Int
,它总是会给你一个
Int
。但是它不能为每个结果返回一个
N
,因此命题应该类似于所有N.(int(N)->存在X.(int(X)&fib(N,X))。也许这就是水星类型系统中对fib(int::in,int::out)的解释。是的,这一命题是
is det
含义的一部分,另一部分是X对于每个N是唯一的。在水星中,除了类型之外,模式和决定论还提供信息。然而,就这个问题而言,模式和决定论提供了与类型几乎相同的好处。
:- pred fib(int::in, int::out) is det.