次の問題があります。
リストに、長さの昇順でソートされた他のリストが含まれている
sorted(LL)
場合に満たされるpredicate を定義します。LL
例えば:?- sorted([[],[1],[1,1],[1,1,1]]) -> yes. ?- sorted([[],[1],[1,1]]) -> yes. ?- sorted([[1],[],[1,1],[1,1,1]]) -> no.
そして、私はこれまでのところこのコードを持っています:
% shorter/2
shorter([],_).
shorter([_|T1], [_|T2]) :- shorter(T1,T2).
% sorted/1
sorted([]).
sorted([_]).
sorted([L1,L2 | T]) :- shorter2(L1, L2), sorted([L2,T]).
問題は上記の行に含まれています: sorted([L2,T])
. リストのリストに 1 つの要素しか残っていない場合、その呼び出しは空のリストを追加する[]
ため、short/2 は失敗します。これは、次の SWIPL トレースに示されています。
[trace] ?- sorted([[1],[2,3]]).
Call: (6) sorted([[1], [2, 3]]) ? creep
Call: (7) shorter2([1], [2, 3]) ? creep
Call: (8) shorter2([], [3]) ? creep
Exit: (8) shorter2([], [3]) ? creep
Exit: (7) shorter2([1], [2, 3]) ? creep
Call: (7) sorted([[2, 3], []]) ? creep <-- empty list appended
Call: (8) shorter2([2, 3], []) ? creep
Fail: (8) shorter2([2, 3], []) ? creep
Fail: (7) sorted([[2, 3], []]) ? creep
Fail: (6) sorted([[1], [2, 3]]) ? creep