嗨,我在一个简单的Prolog专家系统中工作,基于事实和规则。
我遇到的问题是我需要将prolog代码翻译成lisp。我已经做了事实,但不知道怎么做规则我如何翻译这句话:
万向节植物(Y):-植物(Y),有_种子(Y)。
最佳答案
两种语言之间的直接翻译几乎是不可能的,因为它们有非常不同的语义。
在lisp语言中,你定义函数,即“机器”,给定一个输入,产生一个输出。
在Prolog中,通过规则和事实定义关系,这些关系可以有不同的用途:
作为谓词,当您将一个或多个常量值传递给它们时,查看它们是否满足指定的条件(例如,您可以将常量传递给gimnosperms,如果常量既是植物又有种子,则得到yes/no答案),或者它们是否属于事实集。
作为生成器,在其中传递一个“变量”和满足条件的域(在事实中描述)的所有代价项,一个接一个地、交互地或一起生成,
作为某个问题的一般解算器,其中只有一部分输入是给定的数据(常数),而另一部分是分配给常数的变量,使所有条件都满足(并且每次都可以交换输入和输出的角色)。
而这并没有考虑到与lisp中的数据结构相对应的Prolog“函数”,需要正确实现模式匹配机制,也没有Prolog语义固有的非确定性。
因此,首先,每个规则应该对应不同的功能例如,虽然1很容易通过谓词的定义来求解(示例在Common Lisp中):
(defun is-gimnosperms (y)
(and (is-plants y) (is-with_seeds y)))
编写一个生成器(2)相对来说比较容易,例如生成所有可以编写的万向节:
(defun all-gimnosperms ()
(loop for y in (all-plants) when (is-with-seeds y) collect y))
鉴于以下事实和规则:
(defun all-plants () '(oak cypress pine ginkgo ...))
(defun all-with-seeds () '(ginkgo ...))
(defun is-with-seeds (y) (member y (all-with-seeds)))
但一般来说,实现某个问题的通用解算器要复杂得多(在您的示例中没有,因为规则只有一个参数)。
实际上,解决这个问题的唯一合理方法是定义一个通用的unifier,并使用它来实现一个Prolog解释器如果你用谷歌搜索“lisp中的prolog”,你可以找到不同的解决方案,例如在优秀的Paul Graham书的第24章中可以找到。
最后说明
当然,没有什么能阻止一个Prolog规则的不同角色的一个又一个功能的费力实现例如,您可以假设一个规则是通过一个函数实现的,该函数在输入中获取一些内容,这些内容可以是
(CONSTANT x)
,其中x
是一个常量,而(VARIABLE x)
中x
是一个符号,它是一个特殊(全局)变量的名称在第一种情况下,函数将检查x
是否满足规则,在第二种情况下,它将把事实中定义的所有值或满足条件的值赋给变量但这种“手动”方法当然是不可行的:当你有n个参数时,你应该检查并实现2n个不同的情况!