Prolog 人工智能语言中文论坛---打造优质Prolog学习交流园地

一个供Prolog爱好者学习与交流的地方


您没有登录。 请登录注册

强大的List参数传递方法---DCG(Definite Clasue Grammer)语法介绍

浏览上一个主题 浏览下一个主题 向下  留言 [第1页/共1页]

DCG语法大大简化了List参数的传递,
但是我自己当初为了弄明白DCG讲什么花了不少时间,
这里简单介绍一下,有讲错的地方欢迎指正。


使用了"-->"操作符,就是使用了DCG语法,
"-->"前面的谓词自动多带了2个参数(隐藏的),例如

代码:
company --> [i], [b], [m].

虽然company看起来为0个参数,但其实是2个参数,并且隐藏的2个参数都是List,
这里假设为company(A,B),
DCG语法就是使得A与B之差满足"-->"后列出的原子串在一起形成的List,意即A = [i,b,m | B]

因此,如果这时我查询
?- company(Z,[]).
Z就会是[i,b,m]。因为Z减去空List要等于[i,b,m]嘛!,那Z自然就是[i,b,m]了。

如果查询
?- company(Z,[o,r]).
则传回Z = [i,b,m,o,r],一样,因为Z减去后面的[o,r]必须等于[i,b,m],所以Z = [i,b,m,o,r]。

我们也可以在隐藏的2个参数之外额外再传入参数,比如果我们写:
代码:
company(X) --> {X > 0}, [i], [b], [m].
注意这里的"{}",给Prolog看的语法要用{}括起来,DCG语法只能看懂List。

这时候,表示如果我传进去的第一个参数大于零,则传回满足A与B之差为[i,b,m]的List,否则为false。
所以 ?- company(1,Z,[]).
传回 Z = [i,b,m]
?- company(-1,Z,[]).
传回false。


再进一步,"-->"后的条件可以分在不同的谓词里写,比如:
代码:
company(X) --> {X > 0}, word1, word2, word3.

word1 --> [i].
word2 --> [b,b].
word3 --> [m],[m],[m].
那么查询 ?- company(1,Z,[haha]).
传回 Z = [i,b,b,m,m,m,haha].


最后,当然也可以反过来查询了(这本来就是Prolog的一个特点不是吗?),比如:

代码:
what_is_the_company_number(X) --> [i,b,m,X].

则询查 ?- what_is_the_company_number(Z,[i,b,m,9],[]).
传回Z = 9.



查阅用户资料 http://prolog.longluntan.net

浏览上一个主题 浏览下一个主题 返回页首  留言 [第1页/共1页]

您在这个论坛的权限:
不能在这个论坛回复主题