我正在与prolog一起工作,涉及机场数据库(它有机场城市,航班链接包括机场税和持续时间),第一个问题涉及查询。我们应该写一个Prolog查询来回答一个问题,我已经知道如何回答问题是问题是Prolog正在输出更多我想要的信息。我写的查询是:
flight(X,_,Y,_,N), N > 180.
基本上它所做的就是列出所有城市(X是原始航班,Y是目的地航班,N是持续时间)。我想要X和Y,但我不想要N.我能想到让这个工作的唯一方法就是将这个查询包装在一个规则中并让它显示X和Y,但是因为我们不应该写规则我我不知道怎么解决这个问题。我真的不想要一个明确的答案,只是提示或其他东西。
答案 0 :(得分:3)
如果可能,我更喜欢使用表达式压缩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.
当然,要正确缩进表format / 2会更好......
修改强> 也许我误解了这个问题,假设你已经考虑过了
query(X,Y) :-
flight(X,_,Y,_,N), N > 180.
答案 1 :(得分:2)
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源于 (^)/ 2已经在bagof / 3和setof / 3谓词中找到。
再见
答案 2 :(得分:1)
对于像这样的一次性查询,我经常使用简单的打印语句,如:
flight(X,_,Y,_,N), N > 180, print(('X' = X, 'Y' = Y)), nl, fail.
这样做的缺点是:
除非您将工作格式化,否则输出可能很难看。在这里,我正在构建一个,/2
项(带有=/2
个子项),它应该与普通目标解决方案的Prolog输出类似地呈现。
更糟糕的是,目标实际上失败了(为了防止它成功打印出所有许多虚假绑定,例如N
的那些),因此很难在更大的范围内使用。
但这是我所知道的最快捷方式,即在隐藏所有工作变量的同时,将一组解决方案打印到命令行输入的目标上。
答案 3 :(得分:1)
使用library(lambda)
,您可以声明那些应该保持可见的变量。
?- {X,Y}+\ ( flight(X,_,Y,_,N), N > 180 ).
X = c,
Y = d.
答案 4 :(得分:-1)
以下是否提供了可接受的解决方案? findall
在给定给定目标的情况下找到满足给定术语的所有统一。因此,您可以根据需要格式化答案。
findall([X, Y], (flight(X, _, Y, _, N), N > 180), Solutions).