1

私は機能を持っています:

onlySecond([],[]).

onlySecond([H1,H2|T1],[H2|T2]) :- onlySecond(T1,T2).

リスト内のすべての要素を返します。

しかし、最初の引数が1要素のリストである場合、なぜ何も返さないのか(私の意見では、[] - 空のリストを返さなければならない)が不思議です。例:

onlySecond([1],X). - not return anything.. but why it doesn't return []??
4

1 に答える 1

2

あなたのプログラムにはもっと大きな問題があります: それはfalse奇数サイズのリストを返します. その理由は、onlySecond/2ちょうど 1 つのアイテムを持つリストと統合する の 句がないためです。奇数のアイテムを持つリストで開始するときに必ず到達する条件です。再帰呼び出しごとに元のリストの長さを 2 倍:

  • は空のリスト[1]ではないため、最初の句とは統合されません
  • [1]項目が 2 つ未満であるため、2 番目の節とは統合されません。

この問題を解決するには、アイテムが 1 つしかないリストを処理する別の句を追加します。

onlySecond([_], []).

この句を追加すると、奇数長のリストに対してもコードが機能するようになります。

デモ。

于 2015-12-21T20:01:28.693 に答える