Syntax prolog,非常简单的dcg语法

Syntax prolog,非常简单的dcg语法,syntax,prolog,dcg,Syntax,Prolog,Dcg,我试图理解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)). 简单地说,我想做的就是在末尾

我试图理解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
\ux
。我只想让我的
输出
包含如下内容:
te(a,st)。
如果您想接受表单
[Term,bonk]
的输入并获得
te(Term,st)
您应该更改
test/2
以接受bonk a返回
st

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


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

正如您所说,st后面跟着“一堆废话”,因为
\ux
(基本上,\ug6369是变量的内部“名称”,并且由于变量保持未实例化状态,prolog会显示它;请尝试
print(X),X=3,print(X)。

无论如何,您可以简单地删除
(\u 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].

最后,通常建议使用或代替手动添加参数。

通过
短语/2
调用非终端更安全。因此,您的查询应该是:
?-短语(测试(输出),[a,bonk]).
+1:读到邦克威尔的答案真有趣,我现在肯定觉得自己很傻!我可以发誓我在没有任何争论的情况下进行了测试,事实上,这几乎是我来这里进行Stackoverflow的唯一原因!我一定是在早些时候自己尝试时犯了某种错误,因为正如这里的解决方案所解释的,它确实有效。