【问题标题】:Prolog's =.. functionalityProlog 的 =.. 功能
【发布时间】:2010-11-24 12:14:19
【问题描述】:

使用 Prolog 的 =..,是否有可能从 [f,x,g,x] 得到诸如 f(x),g(x) 之类的东西?我可以使用H =.. [f,x,g,x] 来获取f(x,g,x),但这不是我想要的。抱歉,如果这是一个愚蠢的问题,或者我使用 =.. 不正确或其他什么。

任何人都知道任何解释 =.. 用法的好网站吗?

【问题讨论】:

    标签: prolog


    【解决方案1】:

    =../2(也称为 univ/2)能够从列表中构造一个术语,其中列表的第一个元素将是新创建的术语的函子,而列表的其他元素将是它的论据。它不能一次创建多个术语。为此,它的使用次数必须与您要创建的术语数量一样多。

    在您的情况下,您似乎需要三个术语:f(x)g(x),以及这两者之间的连词。在任何 Prolog 顶级实现的提示下发出的以下目标应该可以正常工作(这里我使用 GNU Prolog,因为结果显示比例如 SWI 更清楚):

    | ?- Fx =.. [f, x], Gx =.. [g, x], H =.. [',', Fx, Gx].
    
    Fx = f(x)
    Gx = g(x)
    H = f(x),g(x)
    

    当然,如果您需要在多个地方重用它,您可以定义自己的谓词来封装此功能。

    =../2的解释而言,我是在课堂上和书本上学过Prolog的,所以对于在线资源我不是很了解。不过,有another StackOverflow question 可能对你有帮助。

    【讨论】:

    • 我从来没有为这个 Giulio 感谢你,它真的很有帮助,所以干杯。我明白 =.. 现在好多了,你的解决方案帮助了我。
    【解决方案2】:

    =.. 有时被称为 univ 运算符,据我所知,它的运行方式与您所说的差不多,但仅适用于 ONE 函子。

     ?= f(x,y,z) =.. L
    

    统一以便

    L = [f,x,y,z]
    

    评估为是。您似乎在讨论相反的内容-左侧的列表-很好。但我仍然很确定它只适用于函子和其余的原子或文字。我可能是错的,无论如何我都不是 prolog 专家。

    http://wwwcgi.rdg.ac.uk:8081/cgi-bin/cgiwrap/wsi14/poplog/prolog/ploghelp/univ

    【讨论】:

      【解决方案3】:

      在列表的每个相关部分上使用 univ 将产生两个术语:

      ?- Q=[f,x,g,x],[F,X,G,X]=Q,Fx=..[F,X],Gx=..[G,X].
      Q = [f, x, g, x],
      F = f,
      X = x,
      G = g,
      Fx = f(x),
      Gx = g(x).
      

      【讨论】:

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