3

こんばんは、私は単純な問題を抱えています、そして私はプロローグで非常に新しいことをあなたに警告します。同じサイズの3つのリストがあり、それぞれに1、0、または-1のみが含まれているとします。3つのリストのi番目の要素のすべてのiについて、1つだけが非ゼロであることを確認したいと思います。

このコードは、固定されたiに対してそれを行います。

:- use_module(library(clpfd)).

compat1(V1,V2,V3,I) :-
    length(V1,G),
    nth1(I,V1,X),
    nth1(I,V2,Y),
    nth1(I,V3,Z),
    W is X*X+Y*Y+Z*Z,
    W is 1,
    I in 1..G.

「すべてのIについて、compat1(V1、V2、V3、I)」とはどうすればわかりますか?私は定義しようとしました

compat2(V1,V2,V3,1) :- compat1(V1,V2,V3,1).
compat2(V1,V2,V3,K) :- compat2(V1,V2,V3,J), compat1(V1,V2,V3,K), K is J+1.

興味のあるK=maximum valueで呼び出すことができるようにします。しかし、compat2は機能しません。「;」の後にtrueを返します。無期限に実行されます。

ありがとう!

4

2 に答える 2

3

いくつかの注意:混合library(clpfd)(is)/2ほとんどの場合、良い考えではありません。X #= Y + 1(SWIで)ほぼ同じ効率で代わりに書くことができますがX is Y + 1、その一般性の向上を楽しんでいます。

関心のある関係は、3つのリストのi番目の要素に関連しています。つまり、次のように書くことができます。関心のある関係はmaplist(r, Xs, Ys, Zs)どこにr/3ありますか。したがって、を定義する必要がありますr(X,Y,Z)

どうabs(X)+abs(Y)+abs(Z) #= 1ですか?

これlibrary(lambda)で、すべてを1行にまとめることができます。

maplist(\X^Y^Z^(abs(X)+abs(Y)+abs(Z) #= 1), Xs, Ys, Zs).
于 2011-08-22T18:12:29.550 に答える
0

単純な再帰でそれを行うことができます。プログラムは入力をテストするだけで、ソリューションの生成には使用できません。それが必要な場合は、たとえば を追加するonlyOne(0,0,1). onlyOne(0,0,-1).などして、事実で許可されている値を指定する必要があります。

onlyOne(0,0,_).
onlyOne(0,_,0).
onlyOne(_,0,0).
onlyOne([],[],[]).
onlyOne([H1|T1],[H2|T2],[H3|T3]) :- onlyOne(H1,H2,H3), onlyOne(T1,T2,T3).

編集:質問を読み直すと、最大でも1つではなく、1つのエントリがゼロ以外である必要があると思います。その場合、事実の代わりに次のルールが必要です。

onlyOne(0,0,X) :- X \= 0.
onlyOne(0,X,0) :- X \= 0.
onlyOne(X,0,0) :- X \= 0.
于 2011-08-22T20:40:31.133 に答える