首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SWI-PROLOG中的循环

SWI-PROLOG中的循环
EN

Stack Overflow用户
提问于 2011-01-31 00:30:13
回答 2查看 2.9K关注 0票数 1

我必须创建一个程序,来模拟粒子之间的能量交换,让我解释一下:我必须创建一个包含1000个粒子的列表,每个粒子从能量=5量子开始,然后我必须随机选择2个粒子(P1和P2)来交换1量子能量(E1-1和E2+1)这将是1个交换,我必须进行n交换,直到达到玻尔兹曼分布。

请记住,粒子不能与自身交换能量,并且粒子的能量不能小于1量子。

%创建列表(粒子/能量) 1/5,2/5,3/5...1000/5。

代码语言:javascript
复制
from_to2(P1, P1000, List) :- 
bagof(N/5, between(P1,P1000,N), List),!. 
from_to2(_,_,[]).

%交换1量子的能量到粒子: E1+1,E2-1

代码语言:javascript
复制
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)?

EN

回答 2

Stack Overflow用户

发布于 2011-01-31 07:25:03

以声明的方式思考:N个交换是什么?如果为N=0,则根本不会发生任何交换。否则(隐含地假设N只能采用非负值),发生一次交换,之后发生N-1次交换。代码可能类似于:

代码语言:javascript
复制
n_exchanges(0, L, L) :- !.
n_exchanges(N0, L0, L) :-
        one_exchange(L0, L1),
        N1 is N0 - 1,
        n_exchanges(N1, L1, L).
票数 2
EN

Stack Overflow用户

发布于 2011-01-31 01:14:49

我不认为Prolog完全支持循环,但你可以使用递归来完成它。就像这样

doexchanges(X) :- energyexchange ...

doexchanges(0) :-某种停止条件。

我已经很长一段时间没有做任何prolog了,但是类似于它的结构可以工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4843989

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档