2012-04-25 90 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.