如何在Prolog中断言DCG规则?

如何在Prolog中断言DCG规则?,prolog,dcg,Prolog,Dcg,以下序言为目标test1和test2打印done,但不打印test3。我的理解是,此代码中的match_test2和match_test3应该是等效的。如何通过断言创建DCG规则 setup(['t','e','s','t']). match_test1 --> ['t','e','s','t']. test1 :- setup(C), phrase(match_test1,C), write("done"). test2 :- setup(C),

以下序言为目标
test1
test2
打印
done
,但不打印
test3
。我的理解是,此代码中的
match_test2
match_test3
应该是等效的。如何通过断言创建DCG规则

setup(['t','e','s','t']).

match_test1 --> ['t','e','s','t'].
test1 :-
    setup(C),
    phrase(match_test1,C),
    write("done").

test2 :-
    setup(C),
    assert(match_test2(['t','e','s','t'],[])),
    phrase(match_test2,C),
    write("done").

test3 :-
    setup(C),
    assert(match_test3 --> ['t','e','s','t']),
    phrase(match_test3,C),
    write("done").

使用针对x86_64-darwin14.3.0的SWI Prolog 7.2.3版,运行为
swipl-l bug.pl-t test1
(或
test2
test3

首先使用
expand_term/2
将DCG转换为常规子句:

?- expand_term(match_test1 --> [t,e,s,t], Clause). Clause = (match_test1([t, e, s, t|_1498], _1498):-true). 现在您可以非常方便地编写:

?- T = "test". T = [t, e, s, t]. ?-T=“测试”。 T=[T,e,s,T]。
这种语法非常好,使DCG更容易使用。

首先使用
expand\u term/2
将DCG翻译成常规子句:

?- expand_term(match_test1 --> [t,e,s,t], Clause). Clause = (match_test1([t, e, s, t|_1498], _1498):-true). 现在您可以非常方便地编写:

?- T = "test". T = [t, e, s, t]. ?-T=“测试”。 T=[T,e,s,T]。 这种语法非常好,使DCG更易于使用