3

我正在尝试了解 prolog 和 dcg 的基本语法,但是很难获得有关真正基本内容的正确信息。看看下面的代码,我基本上只是想实现这样的东西:

Output = te(a, st).

Code: 
    test(te(X,Y)) --> [X], test2(Y).
    test2(st(_X)) --> [bonk]. 

    ?- test(Output, [a, bonk],[]).
    Output = te(a, st(_G6369)). 

我想做的就是在末尾添加“st”这个词,我最接近的方法是这样做,但不幸的是 st 后面跟着一堆废话,很可能是因为 singleton _X。我只是希望我Output包含如下内容:te(a, st).

4

2 回答 2

2

如果您想接受表单的输入[Term, bonk]并获取te(Term,st),您应该更改test/2为接受 bonk a return st

test(te(X,Y)) --> [X], test2(Y).
test2(st) --> [bonk].


?-  test(Output, [a, bonk],[]).
Output = te(a, st).
于 2012-12-19T16:57:59.737 回答
1

正如您所说, st 后面跟着“一堆废话”,因为_X(基本上,_G6369 是变量的内部“名称”,并且由于变量保持未实例化,因此序言会显示它;尝试print(X), X=3, print(X).

无论如何,您可以简单地删除,(_X)因为您可以将任何您想要的东西作为参数:

test(te(X,Y)) --> [X], test2(Y).
test2(st) --> [bonk]. 

当然,如果您的输入中实际上没有bonk' 并且您只是想st在末尾添加 a ,您可以进一步简化它:

test(te(X,st)) --> [X].

或者,如果您有bonk

test(te(X,st)) --> [X,bonk].

最后,一般建议使用短语/3短语/2,而不是手动添加参数。

于 2012-12-19T16:58:09.953 回答