prolog' - '构造的行为?

4 prolog

早上好,我坚持在OsmAnd发现的Prolog程序规则.这是一个简化版本:

dest(D) -- ['dest.ogg'|Ds] :- name(D, Ds).
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚--它是什么意思,因为这是我第一次在Prolog程序中看到这样的构造.它看起来像一个替代如下:" dest(D)是通过更换所获得的列表Ds['dest.ogg'|Ds],如果name(D, Ds)".此外,我试图在几个Prolog手册(例如SWI-Prolog)中寻找" - ",但我找不到任何与此类构造相关的内容.

有什么建议吗?它是一个自定义构造?

Wil*_*sem 6

据我所知,该--部分并非针对SWI.这是一个运营商.可能在文件中你会看到:

:- op(900, xfx,--).
Run Code Online (Sandbox Code Playgroud)

(或类似的东西)

所以这里定义运算符(--)/2.接下来,您可以使用带有中缀表示法(--)/3 的谓词(或函子).事实上:

dest(D) -- ['dest.ogg'|Ds] :- name(D, Ds).
Run Code Online (Sandbox Code Playgroud)

简称:

--(dest(D),['dest.ogg'|Ds]) :- name(D, Ds).
Run Code Online (Sandbox Code Playgroud)

这是一个简单的(很简单,它有一个奇怪的名称)谓词定义.但是通过使用优先级900(至少在此答案中)定义运算符,以及模式,xfx您可以在两个术语之间将其用作运算符.

在Prolog, ,is,+,-,*等也都是运营商.如果你写X is 2+2,你实际上写了is(X,+(2,2)).所以这里+被一个仿函数所取代,并且is是一个谓词.因此,两者都没有什么特别之处is/2:它只是一个谓词,它解释了一个描述应该被计算的表达式的语法树的仿函数.

这篇关于SWI Prolog手册操作员条目更深入地解释了操作员.