5

在视觉序言中,序言程序中有“域”部分,您可以在其中定义类型。swi-prolog中是否有类似的东西?

在视觉序言中,类型定义如下:

domains
NewType = thing1; thing2
4

3 回答 3

7

不,但是Mercury中有模式声明。Mercury 不仅仅是 Prolog;它是一种功能逻辑语言。Mercury 仍然有很多 Prolog 语法。

SWI-Prolog 是一个标准的 Prolog。它仅使用文档1中的模式声明作为用户信息。这样的声明可以放在模块的注释中,以便编译文档解析程序。

在标准 Prologs 中,除了注释之外,只有在非常特殊的情况下才允许(并且需要)这样的声明。例如,Sicstus Prolog的block /1 谓词需要它们。

Block/1用于共同路由(延迟评估、延迟等)。在我的生活中,我只block在一个程序中使用过 PAKCS 2,它是另一种功能逻辑语言的解释器。当解释器被移植到 SWI 时,block/1没有使用。

1 SWI 源文档中的类型和模式声明
2 PAKCS,使用block/1谓词的程序(PAKCS 是curry语言的实现。)

于 2010-10-21T23:30:17.287 回答
7

虽然 SWI-Prolog 不支持您所要求的容量的类型,但值得注意的是,它确实支持一个简单的“类型”机制,通过使用中的record/1谓词使用术语规范record图书馆。

此谓词允许您使用特定术语规范语言指定相当复杂的术语“类型”(模式),并将其解释为自动生成用于执行创建(通过构造函数谓词)的谓词,通过“setter”谓词进行修改,并通过'getter' 谓词在术语实例上,都是通过具有特定谓词命名约定的术语扩展来实现的。

这在编写传递相当复杂的术语结构的 Prolog 代码时特别有用,因为它为您提供了 Prolog 通常缺乏的基本类型检查功能(本机)。我已经在许多大型 Prolog 项目中使用了它,其中接口是在实现之前设计的。

于 2010-12-07T09:27:37.267 回答
2

我记得读过关于 Swi & Yap prolog 的类型。这是一个带有“Prolog 的 Hindley-Milner 类型检查器”的网站:

Prolog 的类型 - Mercury 风格的类型声明和谓词签名

Prolog 类型检查器库

于 2012-06-06T07:45:57.960 回答