【问题标题】:prolog treats function call as structure definitionprolog 将函数调用视为结构定义
【发布时间】:2018-05-11 13:58:47
【问题描述】:

我有一个任务将基本算术定义为零增量(即add(inc(inc(inc(zero))),inc(inc(zero)),Z) 给出Z = inc(inc(inc(inc(inc(zero))))))。

add 实现为

add(zero, Y, Z) :- Z = Y.
add(inc(X), Y, Z) :- add(X, Y, V), Z = inc(V).

我正在尝试将 mul 实现为

mul(zero, Y, Z) :- Z = zero.
mul(inc(zero), Y, Z) :- Z = Y.
mul(inc(X), Y, Z) :- mul(X,Y,V), Z = add(Y,Y,Z).

但这会将add(Y,Y,Z) 视为结构定义而不是谓词添加,并且只返回类似于add(add(inc(inc(zero)), inc(zero)), add(inc(zero),(inc(zero)))
有谁知道如何使它将 add 视为谓词?

【问题讨论】:

  • 这是因为inc(X) 在这种情况下不是 Prolog 中的函数调用。同样,add(Y,Y,Z) 只是一个结构,如果您将该术语与Z = add(Y,Y,Z) 中的X 统一起来。事实上,它只是一个结构。这是基本的 Prolog 行为。 Prolog 没有您所知道的功能。它不会将术语/结构作为函数执行。您可以在某些上下文中调用谓词。

标签: prolog


【解决方案1】:

是的。无需查看您的代码的具体细节,一般来说,只需使用它:

mul(inc(X), Y, Z) :- mul(X,Y,V), add(Y,Y,Z).

如果这将(x+1)*y=z 表示为x*y+y=z,它应该是

mul(inc(X), Y, Z) :- mul(X,Y,V), add(V,Y,Z).

相反。在没有回溯的情况下,Prolog 很像一种单赋值函数语言,其代码为 A 范式,其中所有中间值都被显式命名。

统一Z = add(Y,Y,Z) 确实将其两个参数都视为 Prolog 术语。一个是逻辑变量,另一个是复合词。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-09
    相关资源
    最近更新 更多