我必须创建一个程序,来模拟粒子之间的能量交换,让我解释一下:我必须创建一个包含1000个粒子的列表,每个粒子从能量=5量子开始,然后我必须随机选择2个粒子(P1和P2)来交换1量子能量(E1-1和E2+1)这将是1个交换,我必须进行n交换,直到达到玻尔兹曼分布。
请记住,粒子不能与自身交换能量,并且粒子的能量不能小于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),能量交换(L,L2)。给L2= 3/4,1/6,2/5,4/5,5/5...1000/5
L2是第一个交换,现在我需要在下一个交换中使用L2,energexchange(L2,L3)。去做第二次交换,等等...
我应该怎么做才能重复能量交换1000次而不计算失败的次数(当Ex=1)?
发布于 2011-01-31 07:25:03
以声明的方式思考: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).发布于 2011-01-31 01:14:49
我不认为Prolog完全支持循环,但你可以使用递归来完成它。就像这样
doexchanges(X) :- energyexchange ...
doexchanges(0) :-某种停止条件。
我已经很长一段时间没有做任何prolog了,但是类似于它的结构可以工作。
https://stackoverflow.com/questions/4843989
复制相似问题