0

私はプロローグが初めてで、2つの駅が同じ路線にある場合に「はい」を返す述語を書こうとしています。

line(1,[a,b,c,d,e]);
line(2,[b,g,f,e,i,h]);
line(3,[l,m,g,n,f,o,p,q,i,j]);


same_line(X,Y):-
    line(_,L),
    member(X,L),
    member(Y,L).

例: ?- same_line(n,j)。はい

ただし、コンパイル時に WIN-PROLOG で次のエラーが発生します。エラー 67 : 述語が保護されています

私は何を間違っていますか?

4

1 に答える 1

0

答えるだけで、質問が未回答の質問のリストから外れます: はい、(;)/2 は問題です。さらに、本当に yes または no だけが必要な場合は、member/2 の代わりに memberchk/2 を試すこともできます。コードは次のようになります。

line(1,[a,b,c,d,e]).
line(2,[b,g,f,e,i,h]).
line(3,[l,m,g,n,f,o,p,q,i,j]).

same_linechk(X,Y):-
    line(_,L),
    memberchk(X,L),
    memberchk(Y,L).

そして期待どおりに動作します:

?- same_linechk(n,j).
true.

述語 memberchk/2 は SWI-Prolog の一部であり、一致するメンバーが最初に見つかった後はバックトラックしません。これは基本的に、カットが組み込まれた menber/2 であるため、平均で 2 倍の速さになります。

さよなら

于 2014-05-18T13:07:40.973 に答える