将 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 很容易实现。
此外,使用 prolog-dif 而不是不太通用的 (\=)/2
。 father_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
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 很容易实现。
此外,使用 prolog-dif 而不是不太通用的 (\=)/2
。 father_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