如果我想使用DCG标记一个长列表,下面两个谓词之间的优选方法是什么;
1-使用['terminal']
some_terminals(T) -->
['this('],end(T),[')END'].
2 - 使用“终端”
some_terminals(T) -->
"this(",end(T),")END".
end(T)-->[T].
其他问题
;
和|
答案 0 :(得分:2)
这取决于可用于读取原始输入的方法。 第二个是它在read_line之后立即有用,而第一个需要一个tokenizer。
但是,一个令牌化器,至少是一个可重复使用的令牌器,应该返回这些令牌。
some_terminals(T) -->
[this,'('],end(T),[')','END'].
此外,它应该处理空格,注释等。空格通常带有语义,在某些语言中,如Python也是结构上的基础。
关于差异; &安培; |,没有。两者都是Prolog disjunction的语法糖(即具有相同functor / arity的多个子句)
答案 1 :(得分:1)
在第一种情况下,你可以更好地使用原子类型和第二种情况用于字符串类型。如果你做更多的功能,那么第一种是最好的。如果有字符串类型处理第二是good.methods取决于规范。
然后;
和|
在功能上相同,都用于or
操作。但list-->[a;b;c]
会给出一些结果|
给出错误
?- list(S,[]).
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.