私は質問を受けました:
整数のリストが正しく昇順になっているかどうかをチェックする述語、ordered/1 を定義します。たとえば、ゴール
ordered([1,3,7,11])
は成功する必要がordered([1,3,3,7])
ありますが、ゴールordered([1,7,3,9])
は失敗する必要があります。
これまでのところ、私はこれを持っています:
ordered([]).
ordered([N, M|Ns]):-
append(M, Ns, Tail),
ordered(Tail),
N =< M.
しかし、すべてのリストで失敗します。
失敗する理由は、リストの最後の番号に到達し、その番号を空のリストと比較しようとするためだと推測しました。整数を空のリストと比較できないため、明らかにこれは失敗します。可能で、たとえば、0
空のリストに対して返されたとしても、数値が よりも大きくなり0
、未満ではないため、 false が返されます。
解決策が見つかりません...何かアイデアはありますか? ありがとう、ジョン。
編集
したがって、いくつかのわずかに修正されたコード:
ordered([]).
ordered([N]):-
N >= 0.
ordered([N, M|Ns]):-
append(M, Ns, Tail),
ordered(Tail),
N =< M.
これは で機能するようになりましordered([1])
たが、より大きなリストはまだ正しく動作しません。
ordered([N, M|Ns])
のようなものを定義に含める必要がありますか?