如何在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更易于使用