Prolog,非常简单的DCG语法

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”后面跟着一堆无意义的东西,很可能是因为单例_X。我只想让我的Output包含类似这样的内容:te(a, st)。


phrase/2调用非终端更加安全。因此,你的查询应该是:?- phrase(test(Output), [a,bonk]). - false
+1:读到那些bonk的回答真是有趣。 - CapelliC
2个回答

2

如果你想接受形式为[Term, bonk]的输入,并获得te(Term,st),那么你应该将test/2更改为接受bonk并返回st

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


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

现在我感觉真傻!我本来以为我测试过没有任何参数,事实上,这几乎是我来到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,而不是手动添加参数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接