Prolog:忽略输出中不需要的变量

时间:2017-04-03 11:50:40

标签: prolog swi-prolog

有没有办法强制prolog CLI只返回我感兴趣的变量的查询结果?一个简单的例子是:

?- mother(M, C1), father(F, C1).

返回所有MFC1的绑定。但我只对MF感兴趣,而C1只是杂乱无章。在这个简单的例子中,它不错,但对于使用许多帮助变量的较长查询,它会更加令人烦恼。

是否有一种通过查询表达的简单方法;我的意思是没有定义单独的规则?

干杯,   亚切克

4 个答案:

答案 0 :(得分:4)

非常直接的方法是使用Ulrich Neumerkel的library(lambda)

例如,在您的情况下,给出样本事实:

mother_child(m, c).
father_child(f, c).

我们收到您的疑问:

?- mother_child(M, C),
   father_child(F, C).
M = m,
C = c,
F = f.

我们希望投射变量C

因此我们将整个查询包装在 lambda 表达式中,这样只有MF具有全局范围,因此由toplevel报告

?- M^F+\(mother_child(M, C),
         father_child(F, C)).
M = m,
F = f.

这显然变得越有用,你想要投射的变量就越多。您只需要指定想要顶层报告的变量。

答案 1 :(得分:2)

在SWI-Prolog中,库(yall)提供您所需的功能,以及更多。

?- {M,F}/(mother_child(M, C),father_child(F, C)).
M = m,
F = f.

答案 2 :(得分:0)

对于你的辅助变量,使用带有_的“辅助变量语法”可能就足够了吗?

请注意查询中C_C的使用之间的区别:SWHISH interface

另见this answer关于Prolog中的(匿名)变量。

答案 3 :(得分:0)

对于SWI-Prolog,它提供一个标志来隐藏以下划线开头的变量。要更改设置,请执行目标

set_prolog_flag(toplevel_print_anon, false).

在SWI-Prolog会话中。或者,您可以将其添加到.swiplrc中。

https://stackoverflow.com/a/34917391/2471388提供了示例的详细答案。