为什么有些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".
这个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".