length([],0).
length([_|Tail],N):-
length(Tail,M),
N is M + 1.
自力で考えたときに
N is N + 1
といったような記述で失敗しませんでしたか。他の多くのプログラミング言語やフローチャートを考える場合に N <- N + 1 というのは変数Nの値を1加算する場合によく用います。しかし、Prologでは、同一の節内の同一の変数は値が同じものとなります。だから、同じ節の中で変数Nを1加算するというのはPrologにはできないのです。これは、大変に不便なようですが、上のlengthのプログラムを考えると別に不便ではないことが判りますね。便利かどうかよりもそもそもプログラミングの考え方が違うということですね。
?- order([1,5,6,6,8,13]).
yes
?- order([1,2,3,4,3]).
no
?- reverse_order([9,8,7]).
yes
?- reverse_order([5,4,2,3]).
no