2013-11-14 110 views
1

我执行Prolog的解释,我想包括一些内置的数学函数(SUM,产品等)。例如,我想能够使使用知识基础这样一个计算:实现算法的Prolog的

NetForce(F) :- Mass(M), Acceleration(A), Product(M, A, F) 
Mass(10) :- [] 
Acceration(12) :- [] 

于是我应该能够作出查询,如?NetForce(X)。我的问题是:在我的解释器中构建这样的功能的正确方法是什么?

特别是,我遇到的问题是,为了评估SumProduct等,必须先评估它们的所有参数(即绑定到数字常量)。例如,虽然以上面的代码应该正确评价,对置换后的规则:

NetForce(F) :- Product(M, A, F), Mass(M), Acceleration(A) 

不会,因为MA未绑定时Product项处理。我目前的做法是简单地重新排列这些术语,以便最后出现数学表达式。这在简单的情况下起作用,但看起来很诡异,而且我希望在多个数学术语或递归的情况下会出现问题。有更好的解决方案吗?

+1

我会建议:使用现有的Prolog系统来构建您的扩展作为元解释器。 – false

+0

请参阅http://stackoverflow.com/questions/14527682/implementing-prolog-in-c-or-c/14536068#14536068 – false

+0

是的,我认为这是有道理的,但我不确定它是否会在我的项目的大背景。我会研究它。 – user1604015

回答

2

您正在描述的功能作为约束扩展存在于现有系统中。有CLP(Q)超过合理性,CLP(R)超过实际 - 实际上是浮动的,最后是CLP(FD),通常延伸到CLP(Z)。参见例如 library(clpfd)

在任何情况下,从头开始使用Prolog实现将是一项不小的工作,您将没有时间调查要实现的内容,因为您将被更低级别的细节淹没。所以你将不得不使用更经济的方法,并澄清你实际上想要做什么。

你可以研究,在现有的系统实现约束语言。或者您可能需要use a meta-interpreter based approach。或者,也许你想从头开始实施Prolog系统。但不要指望你全部成功。

而且节省您的另一项努力:重用现有的标准语法。您使用的语法将需要您构建额外的解析器。

+1

明白了。我想我会开始至少考虑实施所需的约束机制。你有这方面的资源建议吗? – user1604015

+1

SWI-Prolog(opensrc)和SICStus(商业)拥有这一切+ CHR,等等。 – false

0

谓词不会条款顺序无关,这是非常重要的。您需要确定谓词的使用模式 - NetForce()的使用模式是什么?如果我喜欢的设计力量谓语,我会做类似

force(Mass,Acceleration,Force):- Force is Mass * Acceleration. 

这有+,+,使用模式 - 这意味着你给我的质量和加速度,我会给你力量。

否则,你根据你定义了统一的变量的事实,如果你把它们传递给产品首先,他们将继续统一和统一,你将永远不会停止。

+0

那么,使用模式 - 大致 - 就像确定评估顺序一样吗? – user1604015

+0

那么你的查询?NetForce(X)是一个生成器,它试图生成值来分配X。这是你的意图吗?我的意思是,因为从字面上看,任何整数值都是正确的统一。 –

1

你可以使用coroutining推迟产品的评价:

product(X, A, B) :- freeze(A, freeze(B, X is A*B)) 

freeze/2延迟其第二个参数的赋值,直到第一个参数是地面。这样使用嵌套,它只在AB绑定到实际条件之后评估X is A*B。(免责声明:我不是高级Prolog主题的专家,可能会有更简单的方法来执行此操作 - 例如,我认为SICStus Prolog具有“块声明”,它们以更简洁的方式做了几乎相同的事情方式和概括所有谓词的声明)

+0

(when)/ 2 -claclarations是最适合的,如果你想从字面上重用(是)/ 2。但限制要好得多。 – false

+0

@false AFAIK SICStus块声明是改进的when声明,并且主要用于实现约束求解。所以如果OP试图实施他自己的约束系统,他们可能会有所帮助。 – l4mpi

+0

而AFAIK,'block'声明是在内建'when/2'之前出现的,在此之前,'wait'声明以SICStus 0.7为特色。在任何情况下,仅基于任何这些构造实施约束**系统**都会导致**弱**一致性,并且不能被推荐。 – false