0

我在数据库中有类似的东西。

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

我写了一个谓词,叫做测试。

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

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

4

2 回答 2

1

好吧,正如您所看到findall/3的,不一定应该与绑定的最后一个参数一起使用,例如在 SWI-Prolog 中,在其描述中我们可以阅读:

findall( +Template, :Goal, -Bag )

这表明Bag调用时必须是空闲的。遗憾的是,有些谓词并非以所有可能的方式起作用!

不过,您可以轻松编写另一个谓词来测试它:

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

顺便说一句,由于您的关系显然不是Ssand之间的双射Cs,因此您不应该期望结果是相反的(test(A, R), reverse_test(R, A2)不会导致A == A2

于 2012-04-25T14:12:43.643 回答
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.
于 2012-04-25T14:23:44.787 回答