将 Prolog 代码翻译成 Lisp

Translating Prolog code to Lisp

Prolog 和 Lisp 都被认为是 AI 编程语言。根据给定的父子关系搜索兄弟姐妹的以下 Prolog 代码的 Lisp 等价物是什么:

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 的问题。因此,我应该重新开放它。

Lisp 是一种 函数式 编程语言(或者更确切地说,是具有纯函数子集的命令式语言),因此 关系式 编程Prolog 启用的功能不会转移到 Lisp,至少不会直接转移到 Lisp,因为函数只是关系的 特例 并且可以很容易地表达,而用函数来表达关系参与度更高。

最值得注意的是,一个函数只能在一个方向上工作,因此您不能指望直接使用 Lisp 来回答更一般的情况,而这些情况使用 Prolog 很容易实现。

此外,使用 而不是不太通用的 (\=)/2father_child/2 是一个很好的关系名称,可以清楚地表明每个参数是什么。

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

对于这样的示例,通常使用 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