让我们使用以下序言库:
father(anakinSkywalker, princessLeia).
father(anakinSkywalker, lukeSkywalker).
saysOhNo(lukeSkywalker).
sdesciencelover询问如何通过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 上的免费版本)运行一些查询并打印结果,就像它们以交互方式进行一样,但不需要我手动输入(或复制粘贴)每个查询?
编辑:一种将一系列查询存储在文件中(在kb.pl
文件中或辅助文件中)并全部运行它们的方法,显示它们的结果会更好。