微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 DCG 解析项目列表?

如何解决使用 DCG 解析项目列表?

你如何解析作为项目列表的字符串

  1,2,3,4
  aa,b,ccc,ddd

目前我这样做(并且是逗号):

sub(X,Y) --> req(X),[and],req(Y).
sub(X) --> req(X).

req(on(X,Y)) --> [X,is,on,the,Y],!.
req(on(X,!.
req(isa(X,a,Y].


?- phrase(sub(T,U),[Box,table,and,Box,object],R).
T = on(Box,table),U = isa(Box,object),R = [].

在这种情况下 sub() 有两个不同的头 sub(X) 和 sub(X,Y) ,这会混淆更高的级别。


我这样做了:

sub([X|Y]) --> req(X),sub(Y).
sub([X]) --> req(X).

这似乎有效......但返回的结果太多......??

?- phrase(sub(T),object,apple,fruit],R).
T = [on(Box,isa(Box,isa(apple,fruit)],R = [] ;
T = [on(Box,object)],R = [and,fruit] ;
T = [on(Box,table)],a|...].

它应该在第一个结果处停止......!!


哦,我必须颠倒顺序,对吗?

sub([X]) --> req(X).
sub([X|Y]) --> req(X),sub(Y).

解决方法

根据您的最后定义:

sub([X]) --> req(X).
sub([X|Y]) --> req(X),[and],sub(Y).

以下查询有效:

?- phrase(sub(Sub),[box,is,on,the,table,and,box,a,object]).
Sub = [on(box,table),isa(box,object)] ;
false.

?- phrase(sub(Sub),object,apple,fruit]).
Sub = [on(box,object),isa(apple,fruit)] ;
false.

请注意,我只给 phrase 提供了两个参数。 phrase 有一个有两个参数的形式,一个有三个参数。作为初学者,您几乎肯定只想使用二参数形式。两个参数的形式解析你给它的整个列表,并且只有当列表中的所有内容都可以被解析时才会成功。这几乎肯定是您作为初学者想要的。三参数形式允许您仅解析列表的开头,然后取回未解析的后缀。你不够先进,不需要这个。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。