2011-01-30 222 views
1

我必須創建一個程序,來模擬粒子之間的能量交換,讓我解釋一下:我必須創建一個1000個粒子的列表,每個粒子 開始的能量= 5個量子,然後我必須隨機選擇2個粒子(P1和P2)交換一個量子能量(E1-1和E2 + 1),這將是交換,我必須進行交換直到達到boltzmann分佈。SWI-PROLOG中的循環

請記住,粒子不能與自己交換能量,並且粒子不能具有量子能量。

%創建一個列表(粒子/能量)[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 ,能量交換(L2,L3)。做第二次交換等等......

我應該怎樣做1000次重複energygexchange而不計算失敗(當Ex = 1時)?

+0

您應該調用可能在代碼中儘早失敗的謂詞:例如,如果Ex不大於1,那麼`Ex> 1`可能會失敗 - 所以把它放在`選擇(L1,Px/Ex)`之後,否則你會做所有下面的列表操作! `Ey2`一樣。另外,我不確定你的列表中的選擇是否真的是隨機的,因爲你的`add`謂詞將總是在你列表的最後插入改變的粒子 - 因此,再次選擇一個已經改變的粒子的機會可能會低於選擇任何其他粒子的機會。 – 2011-01-31 02:53:05

回答

0

我不認爲Prolog支持直接循環,但您可以使用遞歸來完成它。喜歡的東西

doexchanges(X): - energyexchange ...

doexchanges(0): - 某種形式的停止條件的。

我很久沒有做任何序言了,但是結構類似的東西可以工作。

2

用聲明思考:什麼是N交換?如果N = 0,則根本不進行交換。否則(隱含地假定N只能取非負值),發生一次交換,然後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).