在可视化序言中,序言程序中有“域”部分,您可以在其中定义类型。 swi-prolog中有类似的东西吗?
在视觉序言中,类型定义如下:
domains
NewType = thing1; thing2
不。但Mercury中有模式声明。 Mercury 不仅仅是 Prolog;它是一种“功能逻辑”语言。 Mercury 仍然有很多 Prolog 语法。 SWI-Prolog 是一个标准的 Prolog。它仅使用文档
1中的模式声明作为用户的信息。这些声明可以放在模块的注释中,以便编译文档解析程序。 在标准 Prolog 中,除了注释之外,只有在非常特殊的情况下才允许(并且需要)这样的声明。例如,Sicstus Prolog 的
blockBlock/1 用于协同路由(惰性求值、延迟等)。我一生中只在一个程序中见过 block
,PAKCS
2,它是另一种函数逻辑语言的解释器。当解释器移植到SWI时,没有使用
block/1
。1 SWI 源文档中的类型和模式声明
2 PAKCS,使用 block/1
谓词的程序(PAKCS 是 curry
语言的实现。)虽然 SWI-Prolog 不支持您所要求的类型,但值得注意的是,它确实通过
record
库中的谓词。
此谓词允许您使用特定术语规范语言指定相当复杂的术语“类型”(模式),并将其解释为自动生成用于执行创建(通过构造函数谓词)、通过“setter”谓词和访问器进行修改的谓词通过术语实例上的“getter”谓词,全部通过具有特定谓词命名约定的术语扩展。这在编写传递相当复杂的术语结构的 Prolog 代码时特别有用,因为它为您提供了 Prolog 通常(本身)缺乏的基本类型检查功能。我在许多大型 Prolog 项目中使用过它,其中接口是在实现之前设计的。
我记得读过有关 Swi 和 Yap prolog 类型的内容。这是一个带有“Prolog 的 Hindley-Milner 类型检查器:”的网站