我正在实现一个 Prolog 解释器,我想包含一些内置的数学函数(sum、product 等)。例如,我希望能够使用这样的知识库进行计算:
NetForce(F) :- Mass(M), Acceleration(A), Product(M, A, F)
Mass(10) :- []
Acceration(12) :- []
那么我应该能够进行类似的查询?NetForce(X)
。我的问题是:在我的解释器中构建这样的功能的正确方法是什么?
特别是,我遇到的问题是,为了评估Sum
,Product
等,必须首先评估它们的所有参数(即绑定到数字常量)。例如,虽然上面的代码应该正确评估,但置换规则:
NetForce(F) :- Product(M, A, F), Mass(M), Acceleration(A)
不会,因为M
并且在处理术语A
时不受约束。Product
我目前的方法是简单地重新排序术语,以便数学表达式最后出现。这在简单的情况下有效,但看起来很笨拙,我希望在具有多个数学术语或递归的情况下会出现问题。有更好的解决方案吗?