使用DCG标记长列表

时间:2016-02-27 06:47:03

标签: list prolog dcg

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

1-使用['terminal']

some_terminals(T) -->
     ['this('],end(T),[')END'].

2 - 使用“终端”

some_terminals(T) -->
     "this(",end(T),")END".
end(T)-->[T].

其他问题

;|

之间的区别是什么?

2 个答案:

答案 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.