0

リスト内の要素が空のリスト [] であるかどうかを確認するにはどうすればよいですか?

私は次のものを持っています:

display_degrees([A,B,C,D]):- write(B).

display_degrees([A,B,C,D]):- B==[], nl,write('has no degree'), nl, !.

次のようなものを入力すると:

display_degrees([1,[],3,4]).

「学位がありません」ではなく、[] を取得します。私の構文は間違っていますか?この述語にこのように句を追加することはできませんか?

4

2 に答える 2

2

目標が成功すると証明探索が停止するため、この動作が発生します。入力するとき

display_degrees([1,[],3,4]).

最初のルールは統一してBと書きます。成功したのでやめます。Prolog に検索を続けるように指示すると、2 番目の節が見つかります。swiplで、私は得る

?- [foo].
?- display_degrees([1,[],3,4]).
[]
true r  % I type 'r' there
has no degree
true.

Prolog を学んでいるだけなら、カット演算子を避けることをお勧めします! しばらくの間。また、IO を実行することは、最も直感的なことではありません。自然数や再帰関数などを定義する演習をいくつか試してみます。例:

plus(z, X, X).
plus(s(X), Y, s(Z)) :- plus(X, Y, Z).
于 2013-10-18T19:50:47.977 に答える
1

あなたが持っているものの問題は、より一般的なルールが最初に発火することです。順序を切り替えることができます:

display_degrees([A,[],C,D]) :- nl, write('has no degree'), nl, !.
display_degrees([A,B,C,D]) :- write(B).

最初の述語については、次のように書くこともできます。

display_degrees([A,B,C,D]) :- B == [], nl, write('has no degree'), nl, !.

しかし、最初に示した「近道」は、このような Prolog 述語に対してより慣用的です。

決定論的に1つの選択肢が必要であることを知っているので、私はカットを保持しました。最初のルールは、2 番目のリスト要素が である場合にのみ一致し[]ます。

| ?- display_degrees([1,[],3,4]).

has no degree

yes
| ?- display_degrees([1,2,3,4]).
2

yes
| ?-
于 2013-10-18T20:25:51.627 に答える