List 使用DCG标记化长列表

List 使用DCG标记化长列表,list,prolog,dcg,List,Prolog,Dcg,如果我想使用DCG标记一个长列表,下面两个谓词之间的首选方法是什么 1-使用['terminal'] some_terminals(T) --> ['this('],end(T),[')END']. 2-使用“终端” some_terminals(T) --> "this(",end(T),")END". end(T)-->[T]. 其他问题 之间有什么区别和|这取决于可用于读取原始输入的方法。 第二个是read_行之后立即有用的内容,而第一个则需要标记

如果我想使用DCG标记一个长列表,下面两个谓词之间的首选方法是什么

1-使用['terminal']

some_terminals(T) -->
     ['this('],end(T),[')END'].
2-使用“终端”

some_terminals(T) -->
     "this(",end(T),")END".
end(T)-->[T].
其他问题


之间有什么区别
|

这取决于可用于读取原始输入的方法。 第二个是read_行之后立即有用的内容,而第一个则需要标记器

但是标记器(至少是可重用的标记器)应该返回这些标记

some_terminals(T) -->
     [this,'('],end(T),[')','END'].
此外,它还应该处理空白、注释等。空白通常带有语义,在某些语言(如Python)中,空白在结构上也是基本的


关于&|,,没有。两者都是Prolog析取的语法糖(即具有相同functor/arity的多个子句)

在第一种情况下,您可以使用atom类型,而在字符串类型中使用第二种情况更好。如果您执行更多函数,则第一种是最好的。如果处理字符串类型,则第二种是好的。方法取决于规范

然后
|
在功能上是相同的,它们都用于
操作。但是
列表-->[a;b;c]
会给出一些结果
|
这样写会产生错误。
?-列表,[])。

S=[(a;b;c)]。

编辑
字符串类型

det --> "a".
noun --> "cat".
det_noun-->det,noun.

?- det_noun("acat",[]).
true.
原子型

det --> [a].
noun --> [cat].
det_noun-->det,noun.

?- det_noun([a,cat],[]).
true.

@CappeliC在我看来,我更喜欢第一个,因为如果我使用trace/0(而不是含糊不清的代码),它会澄清执行的跟踪,但从逻辑上讲,我认为第二个更快,因为最终,输入将被转换为Codesthnk,我认为字符串是atom的子类型。你能解释两种类型之间的区别吗?请参见编辑。有关
[a;b;c]
的更多参考是无效语法。只有SWI接受这一点。