簡體   English   中英

用 DCG 解析項目列表?

[英]Parsing list of items with DCG?

您如何解析作為項目列表 fe 的字符串

  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,Y)) --> [X,is,on,Y],!.
req(on(X,Y)) --> [X,on,Y],!.
req(isa(X,Y)) --> [X,is,a,Y].


?- phrase(sub(T,U),[box,is,on,the,table, and, box,is,a,object], R).
T = on(box, table),
U = isa(box, object),
R = [].

但是在這種情況下 sub() 有兩個不同的頭 sub(X) 和 sub(X,Y),這會弄亂更高的級別。


我這樣做了:

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

這似乎有效...但返回太多結果..??

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

它應該停止在第一個結果......!


哦,我必須顛倒順序,對吧?

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

使用您的最后一個定義:

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

以下查詢有效:

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

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

請注意,我只給了兩個 arguments 給phrase phrase的形式有兩個 arguments,一個有三個 arguments。 作為初學者,您幾乎肯定只想使用兩個參數的形式。 兩個參數的形式解析你給它的整個列表,並且只有當列表中的所有內容都可以被解析時才會成功。 這幾乎可以肯定是您作為初學者想要的。 三參數形式允許您僅解析列表的開頭,然后取回未解析的后綴。 你不夠先進,不需要這個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM