什么是" - >" prolog中的运算符?

时间:2014-07-01 04:57:05

标签: prolog

我的代码在Prolog:

act( [left, Susan, Bahman, Hosein, left, T1],
     (Ahmad)left --> (Ahmad)right,
     [right, Susan, Bahman, Hosein, right, T2]) :-
   T2 is T1 + 1.

什么是-->

2 个答案:

答案 0 :(得分:2)

-->是一个内置的中缀运算符,用于prolog的内置DCG支持(DCG = Definite Clause Grammar )。它的使用方式如下:

sentence    --> noun_phrase , verb_phrase .
noun_phrase --> det , noun .
verb_phrase --> verb , noun_phrase .

det  --> [the] .
det  --> [a]   .

noun --> [cat] .
noun --> [bat]  .

verb --> [tickles] .
verb --> [eats]    .

这只是一种方便的方式(语法糖
sentence(    S1,S3 ) :- noun_phrase(S1,S2) , verb_phrase(S2,S3) .
noun_phrase( S1,S3 ) :- det(S1,S2) , noun(S2,S3) .
verb_phrase( S1,S3 ) :- verb(S1,S2) , noun_phrase(S2,S3) .

det(  [the|X]  , X) .
det(  [a|X]    , X) .

noun( [cat|X]  , X) .
noun( [bat|X]  , X) .

verb( [tickles|X] , X ) .
verb( [eats|X]    , X ) .

并为您提供一小组句子的解析器。

这些都不适用于您的情况 - 表达式X --> Y只是结构'-->'(X,Y)的中缀表示法。

你的例子:

act( [left, Susan, Bahman, Hosein, left, T1],
     (Ahmad) left --> (Ahmad) right ,
     [right, Susan, Bahman, Hosein, right, T2]
) :-
   T2 is T1 + 1
.

甚至不是有效的Prolog,除非您将leftright定义为后缀运算符。在这种情况下,它完全等同于:

act( [ left , Susan , Bahman , Hosein , left , T1 ] ,
     left(Ahmad) --> right(Ahmad) ,
     [ right , Susan , Bahman , Hosein , right , T2 ]
) :-
   T2 is T1 + 1
.

由于您的姓名(SusanBahmanHoseinAhmad)都以大写字母开头,因此它们是变量而不是 atoms strings ,使整个表达式等效于

act( [left,S,B,H,left,T1] , left(A) --> right(A) , [right,S,B,H,right,T2] ) :-
   T2 is T1 + 1 .

所有这一切都匹配三个参数并强制执行约束,即右列表的最后一个元素T2比左列表中最后一个元素的值{1}更多1 {}

答案 1 :(得分:0)

答案分为两部分:-->在这个例子中做了什么,以及它一般做了什么。

在给定的例子中,它什么也没做。 Prolog允许操作员充当算子。函数是Prolog的内置递归数据结构。例如,Prolog中的foo(bar, baz)大致相当于名为foo的对象,其第一个字段设置为bar,第二个字段设置为bazbar --> baz-->(bar, baz)相同,与前一个相同,只有-->作为仿函数的名称。

一些Prolog口译员,例如SWI-Prolog,将头部以-->而不是:-结尾的规则解释为语法规则。见this article

在您的示例中并非如此,因为act规则标题以:-结尾。

看起来,act谓词需要调用act(List1, L-->R, List2)。我从你的简短代码中无法理解为什么。