2012-12-19 64 views
3

我想了解prolog和dcg的基本语法,但确实很难获得关于真正基本的东西的正确信息。看看下面的代码,我基本上只是想实现这样的事情:序言,非常简单的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跟着一堆废话,最有可能是因为单身人士_X。我只是希望我的Output包含这样的:te(a, st).

+0

通过'phrase/2'调用非终端更安全。因此,您的查询应该是:'? - phrase(test(Output),[a,bonk])。 – false

+0

+1:阅读答案很有趣* bonk * – CapelliC

回答

2

如果你想接受的形式[Term, bonk]的输入,并获得te(Term,st)你应该改变test/2接受邦克返回st

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


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

现在我确实感到很傻!我可以发誓我没有任何争论,事实上,这几乎是我来到这里来Stackoverflow的唯一原因!当我自己尝试时,我一定犯了一些错误,因为正如这里解释的解决方案一样,它确实有效。 – Deragon

1

正如你所说,ST由于_X(基本上,_G6369是变量的内部“名称”,并且由于该变量保持无实际意义,所以prolog显示它;“print(X), X=3, print(X).

“ ”

无论如何,你可以简单地删除(_X),因为你可以有你想要作为参数什么:

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

当然,如果你实际上并没有在你的输入bonk的,你只是想添加一个st在最后,你可以把它简化更:

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

或者,如果你有bonk的:

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

网络最后,通常建议使用phrase/3phrase/2而不是手动添加参数。