【问题标题】:Very basic dcg prolog syntax非常基本的 dcg prolog 语法
【发布时间】:2012-12-16 15:40:25
【问题描述】:

我正在尝试理解序言和定句语法,但我很难理解它们。

我真的很想了解如何使用 dcg 语法...

这里有两个例子:

第一个实际上是这个论坛上另一个问题的代码,但还有一个问题:

代码如下所示:

s --> first, operator, second.
first --> [X].
operator --> ['+'].
second --> [X].

当 Prolog 被问及这个问题时,它返回真/假,但我一生都无法弄清楚如何实际修改它以“绑定”值,所以如果被问到 s(X, [2,+ ,2],[])。它会返回 first 的值,所以不是返回 true 它会说 X = 2

回到实际的问题。我在普通序言中有一些规则,这就是其中之一;它实际上并没有做任何事情,只是作为一个例子。

do(X, Y, [H|T], Sum):-
    H == 1, %check if H is 1
    X = H,
    Y = T,
    Additional is H+5,
    Sum is Additional+Additional.

基本上,我在问是否有人可以将其翻译成 DCG,以便我可以尝试理解 DCG 的基本语法!我已经尝试阅读一些教程,但我觉得我还没有变得更聪明......

【问题讨论】:

    标签: prolog dcg


    【解决方案1】:

    DCG: foo(A1, A2, A3, ... , An) --> bar.

    序言: foo(A1, A2, A3, ... , An, X, Y) :- bar(X,Y)

    所以,s 应该改为:

    s(X) --> first(X), operator, second.
    first(X) --> [X].
    operator --> ['+'].
    second --> [X].
    

    当然,返回实际结果可能会更好;为此,您应该将序言代码封装在 DCG 子句中,该子句由{} 完成:

    s(Z) --> first(X), operator, second(Y), {Z is X+Y}.
    first(X) --> [X].
    operator --> ['+'].
    second(X) --> [X].
    

    (当然,如果你有更多的操作符,prolog代码就不会那么简单了)。

    关于do/4 谓词,应该是这样的:

    do(X,Y,[H|T],Sum) -->
       {H == 1, %check if H is 1
        X = H,
        Y = T,
        Additional is H+5,
        Sum is Additional+Additional}.
    

    但我不明白你为什么想要那个。

    最后一个提示:建议使用phrase/3,而不是在 DCG 谓词中添加最后两个参数。

    【讨论】:

      【解决方案2】:

      以有意义的方式将 do/4 翻译成 DCG 并不容易。我已经删除了“复制”DCG 隐藏参数的参数。

      do(Sum) -->
          [1],  %check if H is 1
          {  % braces allow 'normal' Prolog code (but we have no access to 'hidden' arguments)
          Additional is H+5,
          Sum is Additional+Additional
          }.
      

      编辑抱歉,我在Additional is H+5, 中忘记了H,应该读为Additional is 1+5,...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多