[英]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.