为什么有些DCG测试用例使用断言(Rest == [])?

Why do some DCG test cases use assertion( Rest == [])?

这个使用assertion( Rest == [] )?

pharse/3

phrase(:DCGBody, ?List, ?Rest)

因为 phrase/2 等同于 phrase(DCGBody, InputList, []). 而在测试用例 Rest == [] 中,这有什么意义呢?添加 assertion( Rest == [] ) 有什么好处?

phrase(GB__2, Xs, [])等同于phrase(GB__2, Xs),但phrase(GB__2, Xs0,Xs)的第一个解不一定是Xs == [].

这是一个最小的例子:

:- set_prolog_flag(double_quotes, chars).

ao1 --> "a" | [].

ao2 --> [] | "a".

虽然 phrase(aoX, "a") 两者都成功了,但 phrase(aoX, "a", Xs) 显示找到的解决方案的顺序有所不同。

?- phrase(ao1, "a", Xs).
      Xs = "a"
   ;  Xs = [].
?- phrase(ao2, "a", Xs).
      Xs = []
   ;  Xs = "a".