为 Python 重写 Yield Prolog
项目描述
yldprolog
yldprolog 是对YieldProlog的重写,它将 Prolog 编译成可以嵌入到代码中的源代码。Yield Prolog 支持多种编程语言,yldprolog 仅支持 Python。
重写源于同时运行多个 Prolog 实例的需要。在 Yield Prolog 中,活动实例是一个 Python 模块,因此同时拥有多个实例很麻烦。这种重写使用了对象实例,这使得这更容易。
引擎的接口发生了变化,因此现有 YieldProlog 编译器生成的代码与 yldprolog 不兼容。您将需要使用 yldprolog 编译器。
yldprolog 编译器使用 ANTLR 并支持最常见的 Prolog 结构。
用法
编译 Prolog 程序
让我们看看下面的 Prolog 脚本:
%
% The following Prolog code is based on the example "monkey and banana"
% from: Ivan Bratko, Prolog Programming for Artificial Intelligence,
% third edition. ISBN 0-201-40375-7.
%
move(state(middle,onbox,middle,hasnot),
grasp,
state(middle,onbox,middle,has)).
move(state(P,onfloor,P,H),
climb,
state(P,onbox,P,H)).
move(state(P1,onfloor,P1,H),
push(P1,P2),
state(P2,onfloor,P2,H)).
move(state(P1,onfloor,B,H),
walk(P1,P2),
state(P2,onfloor,B,H)).
canget(state(_,_,_,has)).
canget(State1) :-
move(State1,Move,State2),
canget(State2).
您可以使用以下命令编译此 Prolog 脚本:
yldpc monkey.prolog > monkey.py
结果是一个 Python 模块,它将谓词定义为函数。例如,您可以在程序中使用这些模块。
# 1. construct the yldproglog engine
yp = YP()
# 2. load a script from a path or filename
yp.load_script_from_file(pathlib.Path(_SCRIPT_DIR) / 'monkey.py')
# 3. execute the query:
# canget(state(atdoor, onfloor, atwindow, hasnot))
q = yp.query('canget', [yp.functor('state',
[yp.atom('atdoor'), yp.atom('onfloor'),
yp.atom('atwindow'), yp.atom('hasnot')])])
# 4. q is a generator that will give all solutions. Since this
# query has infinitely many solutions, we will just get the
# first one.
self.assertEqual(next(q), False)
构建编译器
安装 ANTLR
您可以使用antlr4来构建 prolog 编译器。您将需要 4.7.2 或更高版本。
手动安装 ANTLR(可选)
如果你系统的antlr4较旧,可以从antlr网页下载ANTLR jar文件:
wget https://www.antlr.org/download/antlr-4.7.2-complete.jar
将此文件保存在某处,并创建一个包装脚本:
#!/bin/bash
java -cp "$HOME/antlr-4.7.2/antlr-4.7.2-complete.jar:$CLASSPATH" \
org.antlr.v4.Tool "$@"
安装 ANTLR Python 运行时
您还需要安装 Python 运行时,例如 (Python3):
pip3 install antlr4-python3-runtime==4.7.2
生成编译器
您可以通过运行来构建编译器make compiler。
项目详情
下载文件
下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。
源分布
yldprolog-1.1.1.tar.gz
(25.3 kB
查看哈希)
内置分布
yldprolog-1.1.1-py3-none-any.whl
(41.0 kB
查看哈希)