Syntax prolog,非常简单的dcg语法
我试图理解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)). 简单地说,我想做的就是在末尾
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的唯一原因!我一定是在早些时候自己尝试时犯了某种错误,因为正如这里的解决方案所解释的,它确实有效。