のほぼ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
間に違いはません、とL1
とN
の等価性は、この全体の述語はおそらく書くことができることを意味します:私はまだあなたがそれを見て、何をしようとして混乱してる
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には「割り当て可能」という変数だけがありません。
「T」とは何ですか? 'E'とは何ですか?あなたは、これらの述語が何をしたいかについて、より詳細な情報を提供する必要があります。いくつかの例が良いでしょう。 –
すみません。 – Marcio