繁体   English   中英

在Prolog查询中隐藏变量

[英]Hiding Variables in a Prolog Query

我正在使用序言进行一项任务,该任务涉及一个机场数据库(它具有机场城市,以及包括机场税和工期的飞行链接),第一个问题涉及查询。 我们应该编写一个Prolog查询来回答一个问题,我已经知道如何回答这个问题,因为Prolog正在输出我想要的更多信息。 我写的查询是:

flight(X,_,Y,_,N), N > 180. 

基本上,它所做的就是列出所有城市(X是出发航班,Y是目的地航班,N是持续时间)。 我想要X和Y,但我不想要N。我想让它起作用的唯一方法是将该查询包装在规则中,并使其仅显示X和Y,但是由于我们不应该编写规则,不知道如何解决这个问题。 我真的不想要一个明确的答案,可能只是一个提示。

在可能的情况下,我更喜欢使用表达式来压缩IO

?- forall((flight(X,_,Y,_,N), N > 180),
           writeln((x=X,y=Y))).

例如,使用不同的发电机

?- forall((member(X,"12"),member(Y,"ab")),writeln((x=X,y=Y))).
x=49,y=97
x=49,y=98
x=50,y=97
x=50,y=98
true.

当然,正确缩进表格格式 / 2会更好。

编辑,也许我误解了这个问题,假设您已经考虑过

query(X,Y) :-
  flight(X,_,Y,_,N), N > 180.

Jekejeke Prolog为该问题提供了独特的解决方案。 它允许(^)/ 2运算符出现在顶级查询中。 因此,如果您有:

?- [user].
flight(a,1,b,2,100).
flight(c,3,d,4,200).
^D

通常,您会得到以下答案,N可能会惹恼您:

?- flight(X,_,Y,_,N), N > 180.
X = c,
Y = d,
N = 200

现在可以隐藏N,如下所示:

?- N^(flight(X,_,Y,_,N), N>180).
X = c,
Y = d

为此目的使用(^)/ 2源自在bagof / 3和setof / 3谓词中已经发现的(^)/ 2的作用。

再见

对于这样的一次性查询,我经常使用简单的打印语句,例如:

flight(X,_,Y,_,N), N > 180, print(('X' = X, 'Y' = Y)), nl, fail.

缺点是:

  1. 除非您进行格式化工作,否则输出可能很难看。 在这里,我正在构建一个,/2项(带有=/2项),该术语应类似于普通目标解决方案的Prolog输出。

  2. 更糟糕的是,该目标实际上无法实现(以防止其成功打印所有诸如N的许多虚假绑定),因此可能难以在更大的对象中使用。

但这是我所知道的最快的方法,它可以为在命令行中输入的目标打印一组解决方案,同时隐藏所有工作变量。

使用library(lambda)您可以声明应保持可见的那些变量。

?- {X,Y}+\ ( flight(X,_,Y,_,N), N > 180 ).
X = c,
Y = d.

以下内容是否提供可接受的解决方案? findall查找满足给定目标的给定术语的所有统一。 因此,您可以根据需要设置答案的格式。

findall([X, Y], (flight(X, _, Y, _, N), N > 180), Solutions).

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM