gpt4 book ai didi

shell - 如何通过 shell 调用在 SWI-Prolog 中显示带有多个自由变量的模式匹配目标的结果?

转载 作者:行者123 更新时间:2023-12-01 11:00:11 25 4
gpt4 key购买 nike

让我们使用以下序言基础:

father(anakinSkywalker, princessLeia).
father(anakinSkywalker, lukeSkywalker).
saysOhNo(lukeSkywalker).

sdescienceloverhow to show the results of pattern-matching goals在来自 shell 调用的 swi-prolog 中,得到了一个答案,给出了对查询的手动转换,以发出写入。

swipl -q -s kb.pl -t "father(anakinSkywalker,X), writeln(X), false"

结果:

princessLeia
lukeSkywalker

当一个人只有几个查询和一个自由变量时,这工作得很好,但手动转换每个查询变得乏味,如果我们想要正确输出每个变量的名称及其结果,很快就会变得非常烦人。例如要运行查询father(AVariable, Another),需要这样写:

swipl -q -s kb.pl -t "father(AVariable,Another), write('AVariable='), write(AVariable), write(', Another='), writeln(Another), false"

结果:

AVariable=anakinSkywalker, Another=princessLeia
AVariable=anakinSkywalker, Another=lukeSkywalker

我试图从管道向它提供命令,但效果不佳(我无法检测到它何时完成写入结果,所以它只是在之后挂起,并且没有换行符分隔答案):

(echo "father(X,Y)."; while true; do echo ";"; done) | swipl -q -s kb.pl

结果:

X = anakinSkywalker,
Y = princessLeia X = anakinSkywalker,
Y = lukeSkywalker.

swipl hangs here, and needs to be stopped with Control-C.

我知道我可以使用 sed 脚本来预处理查询,添加必要的代码以大写字母打印变量,但它需要大量的工作才能处理复杂的查询,例如必须满足两个谓词的地方:

father(X,Y), saysOhNo(Y).

要始终给出正确的结果,需要为 prolog 编写一个解析器,这将是无用的工作,因为 prolog 已经知道如何以交互方式执行此操作。

所以这是我的问题:有没有办法告诉 GNU prolog 或 SWI prolog(或任何其他可以轻松安装在 linux 上的免费版本)运行一些查询并打印结果,只是就像他们会进行交互一样,但不需要我手动输入(或复制粘贴)每个查询?

Edit : 一种将一系列查询存储在文件中(在 kb.pl 文件或辅助文件中)并运行它们的方法,显示它们结果会更好。

最佳答案

到目前为止,这是我找到的方法:

gprolog

使用 false's answer ,我发现必须在 kb.pl 文件的顶部添加一行:

a(_) :- fail.

然后使用./query.sh kb.pl "father(X,Y), saysOhNo(Y)",其中query.sh是:

#!/bin/sh
echo "a(fail)." | gprolog --query-goal "consult('$1'), $2"

当查询立即返回时(即没有结果或只有一个结果并且 gprolog 设法检测到它是最后一个),这将运行查询 consult('kb.pl' ), actual_query.,然后运行查询 a(fail). 这将简单地在控制台上打印一个无关的 no,这要归功于 always-false我们在文件顶部添加的谓词。

gprolog 询问要做什么时(即多个结果,或单个结果并且 gprolog 无法检测到它是最后一个),这将运行查询consult('kb.pl'), actual_query.,读取要求gprolog打印所有结果的a,然后运行query (fail). 这将简单地在控制台上打印一个无关的 no,因为这些只是分组括号,所以查询等同于 fail。.

xsb

可以使用./query.sh kb.pl "father(X,Y), saysOhNo(Y)",其中query.sh是:

#!/bin/sh
(echo "consult('$1'), ${2%.}."; yes halt.) | xsb --noprompt --quietload --nobanner

xsb询问下一步做什么时,如果用户键入一个非空字符串,紧接着enter,它会打印下一个结果,否则它会停止搜索当前查询的解决方案。因此,使用 yes halt. 命令,我们输入了无限的非空行流。 xsb会将所有结果打印到查询中(每次读取halt.,因为是非空字符串,所以会继续下一个结果),并返回到它的提示。然后,它收到的以下 halt. 将告诉它退出。

swi-prolog

我还没有找到解决方案。

[rant]如果构建 prolog 实现的人真的考虑过非交互地使用它们,就像大多数其他语言一样,这一切都会简单得多。[/rant]

关于shell - 如何通过 shell 调用在 SWI-Prolog 中显示带有多个自由变量的模式匹配目标的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11759336/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com