あなたのコードを持つ第一の問題は、句の頭にエラーがあるということである。
len([X],[Y],Count) :- ...
これは、第1および第2のリストだけシングルトン(一つの要素を持つリスト)ことができることを意味します。だから場合には最初の条件が失敗したことを意味
len(X,Y,Count) :-
(
length(X,K),
length(Y,I),
K < I,
Count is 0
);
(
I < K,
Count is 2
);
(
I = K,
Count is 1
).
:第二の問題は、結果として、Prologのインタプリタとしてこれを解釈する、the ;
has higher priority than ,
ということです
len(X,Y,Count) :- ...
:だから、私たちはこれを書き換える必要がありPrologはバックトラックし、そのブランチではI < K
と表示されますが、Prologの場合は新しい変数です(これらは別のブランチにあるため)。 Prologインタプリタは、これが奇妙であることを警告します。特にI < K
と書く場合は、I
とK
を接地する必要があるため、これは間違っています。
あなたはにあなたのプログラムを書き換える必要があります。
len(X,Y,Count) :-
length(X,K),
length(Y,I),
(
K < I,
Count is 0
; I < K,
Count is 2
; I = K,
Count is 1
).
しかし、これは、もちろん、非常に面倒です:
len(X,Y,Count) :-
length(X,K),
length(Y,I),
(
(
K < I,
Count is 0
);
(
I < K,
Count is 2
);
(
I = K,
Count is 1
)
).
以下冗長。
cmp(X,Y,0) :-
X < Y.
cmp(X,Y,2) :-
X > Y.
cmp(X,X,1).
、その後、書き込み:よりエレガントな解決策は、最初のcompare/3
述語を書くことです
cmp(X,Y,0) :-
X < Y.
cmp(X,Y,2) :-
X > Y.
cmp(X,X,1).
len(X,Y,Cmp) :-
length(X,K),
length(Y,I),
cmp(K,I,Cmp).
私はあなたのプログラムが行うことになっているものを得ることはありません。 「カウント」はリストのカウントではなく、コンパレータのようです。さらに、パターンマッチングは間違っています。 –
'length/2'の目標の後にあるすべてのものは、一組の丸い括弧で囲む必要があります。そして、 '[X]'はおそらく 'X'などでなければなりません。 – false