2017-11-04 8 views
0

を比較 len([1,2], [5,2,4], X).私は、次のプロローグプログラム持つプロローグリストの長さ

を私が取得:Singleton variable in branch: K and I

私は、これはここで何を意味するのか見上げました。 http://www.swi-prolog.org/pldoc/man?section=singleton私は_K & _Iをやってみましたが、一度しか行うことはできません。

このプログラムは、2つのリストを取り、出力値を決定するために各リストの長さを比較する必要があります。

+0

私はあなたのプログラムが行うことになっているものを得ることはありません。 「カウント」はリストのカウントではなく、コンパレータのようです。さらに、パターンマッチングは間違っています。 –

+0

'length/2'の目標の後にあるすべてのものは、一組の丸い括弧で囲む必要があります。そして、 '[X]'はおそらく 'X'などでなければなりません。 – false

答えて

2

あなたのコードを持つ第一の問題は、句の頭にエラーがあるということである。

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と書く場合は、IKを接地する必要があるため、これは間違っています。

あなたはにあなたのプログラムを書き換える必要があります。

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). 
+1

あなたの書き換えは元のプログラムと同じくらい悪いです。 'listing/0'を使って一般的な字下げが – false

+0

@falseのように見えるようにしてください。それはその間に変更されています。 –

+0

最後に ';'をつけて不要な大括弧を使います – false

関連する問題