我的代码在Prolog:
act( [left, Susan, Bahman, Hosein, left, T1],
(Ahmad)left --> (Ahmad)right,
[right, Susan, Bahman, Hosein, right, T2]) :-
T2 is T1 + 1.
什么是-->
?
答案 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,除非您将left
和right
定义为后缀运算符。在这种情况下,它完全等同于:
act( [ left , Susan , Bahman , Hosein , left , T1 ] ,
left(Ahmad) --> right(Ahmad) ,
[ right , Susan , Bahman , Hosein , right , T2 ]
) :-
T2 is T1 + 1
.
由于您的姓名(Susan
,Bahman
,Hosein
和Ahmad
)都以大写字母开头,因此它们是变量而不是 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
,第二个字段设置为baz
。 bar --> baz
与-->(bar, baz)
相同,与前一个相同,只有-->
作为仿函数的名称。
一些Prolog口译员,例如SWI-Prolog,将头部以-->
而不是:-
结尾的规则解释为语法规则。见this article。
在您的示例中并非如此,因为act
规则标题以:-
结尾。
看起来,act
谓词需要调用act(List1, L-->R, List2)
。我从你的简短代码中无法理解为什么。