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

Prolog: ignore unwanted variables in the output

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

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

所有 MFC1 的 returns 绑定。但我只对 MF 感兴趣,而 C1 只是混乱。在这个简单的示例中,它还不错,但是对于包含许多 helper 变量的较长查询,它就更令人烦恼了。

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

干杯, 亚采克

一个非常直接的方法是使用 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 具有 全局范围 ,因此被顶层报告

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

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

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

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

也许对您的那些辅助变量使用 "auxiliary variable syntax" 和 _ 就足够了吗?

注意在查询中使用 C_C 的区别:

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

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

set_prolog_flag(toplevel_print_anon, false).

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

.

提供了更详细的示例答案