2010-10-17 3 views
5

в визуальном прологе есть раздел «домены» в пролограммной программе, в которой вы можете определить типы. Есть ли что-то подобное в сви-прологе?Определение типа пролога в swi-prolog

В визуальном прологе тип определяется как:

domains 
NewType = thing1; thing2 

ответ

6

No. Но есть декларация режима в Mercury. Меркурий - это больше, чем Пролог; это язык functional-logic. У Mercury по-прежнему много синтаксиса Prolog.

SWI-Prolog - это стандартный пролог. Он использует только объявления режима в документации 1 как информацию для пользователей. Такие объявления могут быть размещены в комментариях модулей для программ обработки документации для компиляции.

В стандартных прологах, за пределами комментариев, такие объявления разрешены (и требуются) только в особых ситуациях. Например, предикат Sicstus Prolog, например, block/1 требует их.

Блок/1 используется для совместной маршрутизации (ленивая оценка, задержка и т. Д.). Я видел только block, используемый в одной программе в моей жизни, PAKCS 2, переводчик для другого функционально-логического языка. Когда переводчик был перенесен в SWI, block/1 не использовался.

1Тип и режим деклараций в SWI Источник документации
2 PAKCS, программа, используя block/1 предикат (PAKCS является реализация Карри языка.)

7

Хотя SWI-Prolog не типы поддержки в такой же степени, как то, о чем вы просите, стоит отметить, что он действительно поддерживает простой механизм «типа» посредством использования спецификации терминов через предикат record/1 в библиотеке record.

Этот предикат позволяет указать достаточно сложный термин «тип» (шаблон) с использованием конкретного языка спецификации терминов и интерпретировать его для автоматического создания предикатов, используемых для выполнения создания (через предикат конструктора), модификации с помощью «setter», предикатов и аксессуаров через предикаты «getter» на экземплярах термина, все путем расширения термина с конкретным соглашением об именах предикатов.

Это особенно полезно при написании кода Пролога, который проходит вокруг достаточно сложных структур терминов, поскольку он обеспечивает рудиментарную проверку типов, которой обычно не хватает Prolog (изначально). Я использовал это во многих широкомасштабных проектах Prolog, где интерфейсы были разработаны до реализации.