Prolog:忽略输出中不需要的变量
Prolog: ignore unwanted variables in the output
有没有办法强制 prolog CLI return 查询结果只包含我感兴趣的变量?一个简单的例子是:
?- mother(M, C1), father(F, C1).
所有 M
、F
和 C1
的 returns 绑定。但我只对 M
和 F
感兴趣,而 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 表达式中,这样只有 M
和 F
具有 全局范围 ,因此被顶层报告:
?- 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
.
.
提供了更详细的示例答案
有没有办法强制 prolog CLI return 查询结果只包含我感兴趣的变量?一个简单的例子是:
?- mother(M, C1), father(F, C1).
所有 M
、F
和 C1
的 returns 绑定。但我只对 M
和 F
感兴趣,而 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 表达式中,这样只有 M
和 F
具有 全局范围 ,因此被顶层报告:
?- 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
.