【发布时间】:2016-12-04 19:05:24
【问题描述】:
首先,当我阅读 Prolog 上的不同谓词时,例如 http_server,它是这样写的:http_server(:Goal, +Options) : 和 + 在这里是什么意思?有时还会写?。
其次,有时我会看到像_Request 这样在它们之前用下划线声明的变量,即使没有另一个Request,这是为什么呢?
【问题讨论】:
标签: prolog swi-prolog
首先,当我阅读 Prolog 上的不同谓词时,例如 http_server,它是这样写的:http_server(:Goal, +Options) : 和 + 在这里是什么意思?有时还会写?。
其次,有时我会看到像_Request 这样在它们之前用下划线声明的变量,即使没有另一个Request,这是为什么呢?
【问题讨论】:
标签: prolog swi-prolog
+、-、: 等符号被称为模式声明。它们描述了谓词参数的预期实例化,即是否希望您使用未绑定变量、实例化术语等来调用谓词。这些都不是完全标准化的;这里是 SWI-Prolog 约定的描述:http://www.swi-prolog.org/pldoc/man?section=modes
作为第一个近似值,+ 参数是谓词的输入,您应该提供一个基本术语。 - 参数是谓词的输出,谓词将尝试将其与术语统一。 ? 术语可以在调用时部分实例化,谓词可以进一步实例化它。 : 参数是一个元参数,即它是一个由谓词调用的目标(例如 setof/3)。
在http_server(:Goal, +Options) 的示例中,您应该使用绑定到目标的第一个参数调用此谓词,可能是谓词名称。第二个参数必须实例化,大概是一个列表,其格式在文档中进一步描述。如果你不像这样调用这个谓词,例如,如果你传递一个未绑定的变量作为第二个参数,你可能会得到意外的行为或实例化错误。
至于您的第二个问题(最好分开),以下划线开头的变量称为匿名变量。除了_ 本身,每个这样的变量在每个子句中只能出现一次,它可能出现多次并且每次出现时引用单独的变量。
Prolog 系统通常会针对仅出现一次的非匿名变量发出“单例变量”警告,因为这些变量可能是拼写错误或程序员忘记了什么的迹象。您使用匿名变量来表达“这里肯定有一些东西(例如,谓词参数),但我不在乎它是什么”的概念。在您的示例中,大概您调用了一个具有“请求”参数的谓词,但在您的特定用例中,您并不关心请求。
【讨论】:
_Request 而不仅仅是_?只是为了清楚起见,这是一个请求吗?