以下Prolog为目标done
和test1
打印test2
,但不打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").
将SWI-Prolog版本7.2.3用于x86_64-darwin14.3.0,以swipl -l bug.pl -t test1
(或test2
,test3
)
答案 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更易于调试和使用。