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

Jac*_*cek 4 prolog swi-prolog

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

?- mother(M, C1), father(F, C1).
Run Code Online (Sandbox Code Playgroud)

它返回所有M,F和 的绑定C1。但我只对Mand感兴趣F,而C1只是混乱。在这个简单的例子中,这还不错,但是对于具有许多辅助变量的较长查询,它更令人烦恼。

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

干杯,杰克

mat*_*mat 6

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

例如,在您的情况下,鉴于示例事实:

母子(m,c)。
父亲_孩子(f,c)。

我们得到您的查询:

?- Mother_child(M, C),
   父亲_孩子(F,C)。
M = 米,
C = C,
F = f。

我们想投影掉变量 C

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

?- M^F +\(mother_child(M, C),
         父亲_孩子(F,C))。
M = 米,
F = f。

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

  • 正是我需要的。非常感谢!只是在 swi-prolog 中提到 `lambda` 是一个额外的包,需要使用 `pack_install(lambda)` 添加。 (2认同)

Jak*_*dyk 6

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

set_prolog_flag(toplevel_print_anon, false).
Run Code Online (Sandbox Code Playgroud)

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

/sf/answers/2444217401/提供了更详细的答案和示例。


Cap*_*liC 5

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

?- {M,F}/(mother_child(M, C),father_child(F, C)).
M = m,
F = f.
Run Code Online (Sandbox Code Playgroud)