【发布时间】:2020-10-29 16:48:18
【问题描述】:
我正在使用 Prolog 中的术语和签名(一阶谓词逻辑)。
我已获得签名(∅, Z, {add(2), sub(2), mult(2)})。所以没有变量,常量是整数,函数是“add”、“sub”和“mult”。
目标是编写谓词“calc/2”,它接受一个项(给定上面的签名)并根据整数加减乘乘的通常定义计算它。示例:
?- calc( add(sub(8,2), mult(4,-3)), N).
N = -6
(因为 ((8 − 2) + (4 ∗ −3)) = −6)
问题与 this question 类似且相关,但一大区别是我需要避免使用 =.. 运算符来查找函数的名称。相反,我想利用 Prolog 对规则的参数使用模式匹配这一事实,这是我完全坚持的。另外需要注意的是,“add”、“sub”和“mult”不应该是谓词。
我使用 =.. 运算符的第一个解决方案是(借助上面链接的线程的答案):
op(+, add).
op(-, sub).
op(*, mult).
calc(Term, N) :-
calc2(Term, Expr),
N is Expr.
calc2(N,N) :- integer(N).
calc2(Term, Expr) :-
Term =.. [Op_str, Comp1, Comp2],
op(Op, Op_str),
calc2(Comp1, Expr1),
calc2(Comp2, Expr2),
Expr =.. [Op, Expr1, Expr2].
但由于这^不是我正在寻找的解决方案类型,它对我的问题并没有太大帮助。
我可以很容易地执行单个计算(例如 calc(add(1,2), N)),但我遇到比这更复杂的事情。
【问题讨论】:
标签: prolog signature predicate first-order-logic