2011-01-30 218 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).