将Prolog代码翻译成Lisp

时间:2016-07-05 14:09:49

标签: prolog lisp common-lisp

Prolog和Lisp都被认为是人工智能编程的语言。什么是Lisp相当于跟随Prolog代码,它根据给定的父子关系搜索兄弟姐妹:

father_child(tom, sally).
father_child(john, alfred).
father_child(george, peter).
father_child(tom, dick).
father_child(john, harry).
father_child(george, eliz).

siblings(X, Y):-  father_child(Z, X), father_child(Z, Y), X \= Y.   

?- siblings(harry,X).
X = alfred ;

编辑:问题不是太广泛,而是非常具体,将此特定代码转换为Lisp。因此,我应该重新开放。

2 个答案:

答案 0 :(得分:3)

Lisp是一种功能性编程语言(或者更确切地说,是具有纯功能子集的命令式语言),因此Prolog启用的关系编程不会延续到Lisp,至少不是直接的,因为函数只是一个关系的特殊情况并且可以很容易地表达,而在函数方面表达关系则更为复杂。

最值得注意的是,一个函数只能在一个方向中运行,所以你不能期望直接使用Lisp来回答Prolog很容易实现的更多一般情况。

另外,使用 代替不太通用的(\=)/2father_child/2是关系的一个好名字,清楚说明每个参数是什么。

Prolog和Lisp都被认为是人工智能编程的语言,就像布加迪和福特都被认为是汽车制造商一样。

答案 1 :(得分:3)

通常在Lisp中使用嵌入式关系/逻辑语言这样的例子。

该示例使用了KnowledgeWorks,它是LispWorks的扩展,它在Lisp中提供了Prolog的一个版本:

(require "prolog")

(in-package "CP-USER")

(clog:defrel father-child
  ((father-child tom    sally))
  ((father-child john   alfred))
  ((father-child george peter))
  ((father-child tom    dick))
  ((father-child john   harry))
  ((father-child george eliz)))


(clog:defrel siblings
 ((siblings ?x ?y)
  (and (father-child ?z ?x)
       (father-child ?z ?y)
       (/== ?x ?y))))

让我们试一试:

CP-USER 35 > (clog:logic '(siblings harry ?x))
(SIBLINGS HARRY ALFRED)
T