2017-01-04 21 views
0

私はそれは非常に簡単だと思うが、私はそれをどうするか考えていない。 私はアトリビューションで試しましたが、リストに別のリストを受け取りましたが、動作しません。Prologでどのようにリストを置き換えることができますか?

% H is the head of a coordenate and T the tail 
% E is the element that will be placed in the position T 
findLine([L0,L1,L2,L3,L4,L5,L6,L7,L8,L9,L10],H,T,E,NewTray) :- 
    H is 1,replace(L1,T,E,N),L1 = N; 
    H is 2,replace(L2,T,E,N),L2 = N; 
    ... 
    H is 10,replace(L10,T,E,N),L10 = N; 
    NewTray = [L0,L1,L2,L3,L4,L5,L6,L7,L8,L9,L10]. 

私は、L1は、この句でNも、私は句のfindLine内のL1を変更する句を作成することができるのか分からないことが必要です。

%L is the list, C a counter and N the new list 
rewrite(L,C,N) :- 
     Q is C, 
     removeByIndex(Q,L,R), 
     (Q \== 0 -> rewrite(R,Q-1,N), !. 

    removeByIndex(0,[_|T],T):- !. 
    removeByIndex(I,[H|T],R):- X is I - 1, removeByIndex(X, T, Y), insert(H, Y, R). 

しかし、私は同じ問題で連続:私は、内のすべての要素を削除し、新しいものを一つずつ追加してattribuitionの場所でこれを呼び出すように句を作成する考えL1が変更されていない:(

アイデアが行を変更し、トレイに置き換えるです

PSは:私は私の英語のため申し訳ありませんが、しかし、プロローグのトピックでは、ポルトガル語フォーラム

+1

「T」とは何ですか? 'E'とは何ですか?あなたは、これらの述語が何をしたいかについて、より詳細な情報を提供する必要があります。いくつかの例が良いでしょう。 –

+0

すみません。 – Marcio

答えて

1

のほぼinativeている私は本当にわからないよ何」ここで達成しようとしていますが、私はいくつかの点を指摘することができます誤解の兆候として私を襲うings。

まず第一に、あなたが一番上にあるすべての変数をバインドして、あなたは基本的に次のようになりボトムアウト他のケースがあります。さて、あなたはあなたのいずれかにNewTrayに割り当てることはありません

NewTray = [L0,L1,L2,L3,L4,L5,L6,L7,L8,L9,L10]. 

をそれ以外の場合は、NewTrayはほとんどの場合インスタンス化されません。それはあなたが私に言っているものとは思われません。

第二に、あなたの例では、この構造を持っている:ここ

H is 1,replace(L1,T,E,N),L1 = N; 

まず間違いは、そのH is 1です。 is/2は、算術式を評価するためのものです。そこにこれとH = 1間に違いはません、とL1Nの等価性は、この全体の述語はおそらく書くことができることを意味します:私はまだあなたがそれを見て、何をしようとして混乱してる

findLine([L0,L1,L2,L3,L4,L5,L6,L7,L8,L9,L10],1,T,E,_) :- 
    replace(L1,T,E,L1). 
findLine([L0,L1,L2,L3,L4,L5,L6,L7,L8,L9,L10],2,T,E,_) :- 
    replace(L2,T,E,L2). 
findLine(Line, _, _, Line). 

L1は、リレーションが使用された後にいくらかの価値を持ち、突然リレーションが使用された後に新しい値があると思います。それは強調していますではないケース:Prologの変数は正確に1回だけバインドされます。あなたの割り当てL1 = Nまたはに行かないものは、 L1を「新しい値を受け取る」ようにします(そのようなことはPrologでは起こり得ません)。その代わりに、PrologにL1とNを同じ値にバインドする必要があることを通知します。これは、状況によって決まります。彼らが両方とも地面と等しくない場合は、たとえば述語が失敗する原因になりますが、どちらか一方が非地面の場合、他方の値を受け入れます。

私はあなたがここで何をやっているを見ていると私は助けるが、あなたは、本質的にこれを実行しようとしていることを考えることはできません。

?- replace([1,2,3,4,5], 3, foo, Result). 
Result = [1, 2, foo, 4, 5] 

replace([], _, _, []). 
replace([H|T], 1, X, [X|T]). 
replace([H|T], N, X, [H|Replaced]) :- 
    N > 1, succ(N0, N), replace(T, N0, X, Replaced). 

はこのようにそれを使用します

私の人生にとってあなたは何をしようとしているのか理解できませんし、あなたが必要でなければリストのすべての変数を一度にバインドするのはどうしてわかりません一斉に。

とにかく、これが役に立ちますようお願いいたします。多分あなたが何をしようとしているのかをもっと見せてくれれば、私たちがどのように手助けできるかがはっきりします。

編集=のエラボレーションと=

レッツ・混乱の周りに統一し、起こらないものを参照してください。これについて驚くべき

?- X = 3. 
X = 3. 

おそらく何も。

?- 3 = X. 
X = 3. 

統一は割り当てとは異なります。ご覧のとおり、方向性がありません。この行は他の言語では機能しませんでした。

?- X = [1,Y,3]. 
X = [1, Y, 3]. 

Prologは変数を自由にしておくことに問題がないことに注意してください。

ここで、Yが両方の位置で同じであるため、Yを2にバインドすると、Xの中間値も2になります。この機能(差異リスト)を利用するProlog固有のデータ構造があります。この興味深いを作る今何

?- X = [1,Y,3], Q = X, Q = [1,2,3]. 
X = Q, Q = [1, 2, 3], 
Y = 2. 

たちは、明示的にYがプロローグに統一することで、これを推論2であることをプロローグに言わなかったということです。ここでは、XはHとTで構成され、次にHとTが何であるかを伝えました。しかし、Prologの統一は、あなたが行うことの順序についてはあまり気にしません。

?- X = [H|T], X = [1,2,3]. 
X = [1, 2, 3], 
H = 1, 
T = [2, 3]. 

統一は推移的です。

Prologが統合できない場合はどうなりますか?

?- X = [1,Y,3], Q = X, Q = [1,2,3], Y = 4. 
false. 

Yは最初のステップでは2でなければなりませんが、最後のステップでは4でなければなりません。変数がバインドされると、変数は変更されません。これはちょっと複雑な言い方です。

?- X = 2, X = 4. 
false. 

Prologには「割り当て可能」という変数だけがありません。

+0

あなたはあなたが言ったことの例を挙げることができますか?どちらか一方が非根拠であれば、他方の価値を受け入れるでしょうか?私の問題は基本的にこれです、私は私のトレイ(またはボード、私は知らない)をリフレッシュしているため、変更するL1が必要です。それは海軍の戦闘ゲームです – Marcio

+1

@Marcioプロローグには修正変数がありません –

+0

@Marcio私はちょっと精緻化しました。更新された答えを見てください。 –

関連する問題