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

问题描述 投票:2回答:4

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

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

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

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

干杯,Jacek

prolog swi-prolog
4个回答
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.

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


3
投票

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

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

1
投票

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

set_prolog_flag(toplevel_print_anon, false).

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

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


0
投票

也许将_的“辅助变量语法”用于你的辅助变量就足够了?

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

另请参阅this answer关于Prolog中的(匿名)变量。

© www.soinside.com 2019 - 2024. All rights reserved.