Skip to main content

为 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 查看哈希

已上传 source

内置分布

yldprolog-1.1.1-py3-none-any.whl (41.0 kB 查看哈希

已上传 py3