如何在pyswip中创建子句

问题描述 投票:0回答:1

这里有人可以帮助我使用pyswip这样在python内部创建prolog子句

数据库:

man(peter).
woman(adam).
man(jonathan).
man(paul).
woman(cloe).
father(jonathan, peter).
father(pierre, adam).
brother(pierre, paul).
father(pierre, cloe).

这些是功能

child(X, Y) :- father(Y,X).
son(X, Y) :- man(X) , father(Y, X).
daughter(X, Y) :- woman(X), father(Y, X).
brother(X, Y) :- man(X), father(Z, Y), father(Z, X).
sister(X, Y) :- woman(X), father(Z, Y), father(Z, X).

我如何通过pyswip在python中定义这些prolog函数

python prolog swi-prolog
1个回答
1
投票

我现在没有时间做出详细的答复,我将在后面进行更新,但这是我对播放reversi的prolog程序所做的python接口的简单示例。

#!/usr/bin/python

import sys
from pyswip import Prolog, Functor, Variable, Query

prolog = Prolog()
prolog.consult('./reversi_game.pl')
prolog.consult('./alphabeta.pl')

start_board = Functor("startBoard", 1)
b = Variable()
start_board_query = Query(start_board(b))
start_board_query.nextSolution()
print()
print_board(list(b.get_value())) # an 8*8 grid filled with 0 except at the 4 center squares that have x's and o's
start_board_query.closeQuery()

set_to_x = Functor("setToX", 1)
xp = Variable()
set_player_query = Query(set_to_x(xp))
set_player_query.nextSolution()
x_player = xp.get_value()
print()
print(x_player) # 'x'
set_player_query.closeQuery()

所以这里发生了什么?要定义谓词接口,您可以创建一个Functor,并为其提供一个字符串,该字符串是Prolog中谓词的名称及其Arity,您可以根据需要创建任意多个变量,并将它们传递给Functor,从而从中创建一个查询。

然后,您可以根据需要的解决方案在查询对象上继续调用nextSolution(),直到需要的时间,如果我没记错的话,如果失败,结果将为None,并且不再提供任何解决方案。然后使用get_value()函数提取谓词变量的值。

您也可以查看以下内容:https://github.com/yuce/pyswip/tree/master/examples

希望有帮助。

编辑:

我知道这个“所要求的更详细的答案”现在有点晚了,但是无论如何。

© www.soinside.com 2019 - 2024. All rights reserved.