Петля в SWI-PROLOG - PullRequest
       18

Петля в SWI-PROLOG

1 голос
/ 30 января 2011

Мне нужно создать программу для симуляции обмена энергией между частицами, позвольте мне объяснить: мне нужно создать список из 1000 частиц, каждая частица начинается с энергии = 5 квантов, затем я должен случайно выбрать 2 частицы (P1 иP2) чтобы обменять один квант энергии (E1-1 и E2 + 1), это будет 1 обмен, я должен сделать n обмена, пока не достигну распределения Больцмана.

с учетом того, что частица не может обмениваться энергией с собой, а частица не может иметь энергию <1 кванта.</p>

% Создать список (Particle / energ) [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 в следующемобмен, обмен энергией (L2, L3).выполнить второй обмен и т. д. ...

Что я должен сделать, чтобы повторить обмен энергией 1000 раз без подсчета сбоев (когда Ex = 1)?

Ответы [ 2 ]

2 голосов
/ 31 января 2011

Думайте декларативно: что такое 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).
0 голосов
/ 30 января 2011

Я не думаю, что Prolog поддерживает зацикливание напрямую, но вы можете использовать рекурсию для этого.Что-то вроде

doexchanges (X): - energyexchange ...

doexchanges (0): - какое-то условие остановки.

Я не делал прологдолгое время, но что-то похожее на это могло бы сработать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...