0

データベースにこのようなものがあります。

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ですか?これには別の述語を書く必要がありますか?

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 ).

ところで、あなたの関係は明らかにとの間の全単射でSsCsないので、結果が逆になることを期待するべきではありません(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 に答える