2011-01-30 13 views
1

私は、粒子間のエネルギー交換をシミュレートするために、プログラムを作成する必要があります 私は説明しましょう:私は1000粒子の各粒子のリストを作成しなければなりません エネルギー= 5量子で始まり、無作為に2つの粒子 (P1とP2)を1つの量子エネルギー(E1-1とE2 + 1)を交換するために選択すると、これは1 の交換になります、私はboltzmannの分配に達するまで交換をしなければなりません。SWI-PROLOGのループ

パーティクルはエネルギーをそれ自身と交換できないことを覚えておいてください。 パーティクルはエネルギー量が1キロバイトありません。

%リスト(パーティクル/エネルギー)[1/5,2/5,3/5 ... 1000/5]を作成します。

粒子の間のエネルギーの
from_to2(P1, P1000, List) :- 
bagof(N/5, between(P1,P1000,N), List),!. 
from_to2(_,_,[]). 

%所1量子:E1 + 1、E2-1

energexchange(L1,L2):- 
choose(L1,Px/Ex), 
delete(Px/Ex,L1,Listsem1), 
choose(Listsem1,Py/Ey), 
delete(Py/Ey,Listsem1,Listsem2), 
Ex > 1, Ex2 is Ex - 1, add(Px/Ex2,Listsem2,Listcom1), 
Ey2 is Ey + 1, add(Py/Ey2,Listcom1,L2). 

例: -from_to2(1,1000、L)、energexchange(L、L2 )。 L2 = [3/4,1/6,2/5,4/5,5/5 ... 1000/5]

L2は次の交換でL2を使用する必要があります、energexchange(L2、L3)。 2回目の交換など...

失敗回数をカウントせずにenergexchangeを1000回繰り返すにはどうすればよいですか?

+0

コード内で可能な限り早く失敗する可能性のある述語を呼び出す必要があります。 Exが1より大きい場合、 'Ex> 1'が失敗する可能性があります。' choose(L1、Px/Ex) 'の直後に置いてください。そうしないと、以下のリスト操作をすべて静脈で行います! 'Ey2'と同じです。また、あなたの 'add'述語が常にあなたのリストの最後に変更された粒子を挿入するので、リストからの選択が本当にランダムであるかどうかはわかりません - したがって、すでに変更されたパーティクルを再度選択する機会おそらく他のパーティクルを選択するチャンスよりも低いでしょう。 –

答えて

0

私はPrologがループを完全にサポートしているとは思わないが、再帰を使ってそれを達成することができます。 energyexchange ...

doexchanges(0): - - :停止条件のいくつかの並べ替え

doexchanges(X)のようなもの。

私はずっと前から何のプロローグもやっていませんが、それと同じような構造のものは動作します。

2

宣言的に考える:N個の交換とは何ですか? N = 0の場合、交換は全く行われない。さもなければ(暗黙的にNは負でない値しかとれないと仮定して)、1回の交換が行われ、その後にN-1回の交換が行われる。コードは次のようになります。

n_exchanges(0, L, L) :- !. 
n_exchanges(N0, L0, L) :- 
     one_exchange(L0, L1), 
     N1 is N0 - 1, 
     n_exchanges(N1, L1, L). 
関連する問題