swi-prolog 中的 Prolog 类型定义

问题描述 投票:0回答:3

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

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

domains
NewType = thing1; thing2
types prolog definition visual-prolog
3个回答
7
投票

不。但Mercury中有模式声明。 Mercury 不仅仅是 Prolog;它是一种“功能逻辑”语言。 Mercury 仍然有很多 Prolog 语法。 SWI-Prolog 是一个标准的 Prolog。它仅使用文档

1

中的模式声明作为用户的信息。这些声明可以放在模块的注释中,以便编译文档解析程序。 在标准 Prolog 中,除了注释之外,只有在非常特殊的情况下才允许(并且需要)这样的声明。例如,Sicstus Prolog 的

block

谓词需要它们。

Block/1

用于协同路由(惰性求值、延迟等)。我一生中只在一个程序中见过 block,PAKCS

2
,它是另一种函数逻辑语言的解释器。当解释器移植到SWI时,没有使用block/1

1

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

 语言的实现。)

虽然 SWI-Prolog 不支持您所要求的类型,但值得注意的是,它确实通过

7
投票
使用术语规范来支持简单的“类型”机制

record 库中的谓词。

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

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

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

2
投票

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

Prolog 类型检查器库

© www.soinside.com 2019 - 2024. All rights reserved.