2012-04-25 92 views
0

我在数据库中有类似的东西。SWI-Prolog查找X的值

flight(tk1, ist, esb, 40). 
flight(tk2, ist, mlx, 90). 

而且我写了一个名为test的谓词。

test([S], L1):- 
    findall(C, (flight(_, S, C, _)), L1). 

当我写test([ist], X).输出是X = [esb, mlx].所以这是真的,但是当我写test(X, [esb, mlx]).false。为什么它是false?我应该为此写另一个谓词吗?

回答

1

好吧,你可以看到,findall/3不一定应该有约束最后一个参数一起使用,例如在SWI-Prolog的,在其描述中,我们可以读到:

findall(+Template, :Goal, -Bag) 

这表明当被叫时,Bag必须是空闲的。可悲的是一些谓词不能以各种可能的方式工作!

虽然,你可以很容易地编写另一个谓词来测试:

reverse_test(Cs, Ss) :- 
    findall(S, (flight(_, S, C, _), member(C, Cs)), Ss). 

顺便说一句,因为你的关系显然是不SsCs之间的一一对应,你不应该期望的结果是反向(test(A, R), reverse_test(R, A2)不会导致A == A2

0

我试着在SWI-Prolog的,但如预期,它与你暴露的事实的工作:

?- test(X,[esb,mlx]). 
X = [_G3627]. 

如果你尝试的findall独自一人,你应该得到

?- findall(C, (flight(_, S, C, _)), L1). 
L1 = [esb, mlx]. 

否则,如果你比如有没有IST另一个事实,它失败:如果我添加

flight(tk2, xxx, mlx, 90). 

然后

?- test(X,[esb,mlx]). 
false.