如何在Prolog中声明DCG规则?

时间:2016-12-13 17:47:02

标签: prolog dcg

以下Prolog为目标donetest1打印test2,但不打test3。我的理解是,此代码中的match_test2match_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").

将SWI-Prolog版本7.2.3用于x86_64-darwin14.3.0,以swipl -l bug.pl -t test1(或test2test3

运行

1 个答案:

答案 0 :(得分:2)

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

?- expand_term(match_test1 --> [t,e,s,t], Clause).
Clause =  (match_test1([t, e, s, t|_1498], _1498):-true).

然后像往常一样assertz/1使用Clause,即assertz(Clause)

请注意,您可以直接写下原子,即代替'e',只需写下e

此外,请考虑通过添加指令将double_quotes设置为 chars

:- set_prolog_flag(double_quotes, chars).

现在你可以非常方便地写作:

?- T = "test".
T = [t, e, s, t].

这种语法非常好,使得DCG更易于调试和使用。