DCG语法大大简化了List参数的传递,
但是我自己当初为了弄明白DCG讲什么花了不少时间,
这里简单介绍一下,有讲错的地方欢迎指正。
使用了"-->"操作符,就是使用了DCG语法,
"-->"前面的谓词自动多带了2个参数(隐藏的),例如
虽然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个参数之外额外再传入参数,比如果我们写:
这时候,表示如果我传进去的第一个参数大于零,则传回满足A与B之差为[i,b,m]的List,否则为false。
所以 ?- company(1,Z,[]).
传回 Z = [i,b,m]
?- company(-1,Z,[]).
传回false。
再进一步,"-->"后的条件可以分在不同的谓词里写,比如:
传回 Z = [i,b,b,m,m,m,haha].
最后,当然也可以反过来查询了(这本来就是Prolog的一个特点不是吗?),比如:
则询查 ?- what_is_the_company_number(Z,[i,b,m,9],[]).
传回Z = 9.
但是我自己当初为了弄明白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].
这时候,表示如果我传进去的第一个参数大于零,则传回满足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].
传回 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.