[英]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.
缺点是:
除非您进行格式化工作,否则输出可能很难看。 在这里,我正在构建一个,/2
项(带有=/2
项),该术语应类似于普通目标解决方案的Prolog输出。
更糟糕的是,该目标实际上无法实现(以防止其成功打印所有诸如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.