今天晚上我發佈了一個版本(如下圖),但感覺像是我從另一種程序語言移植它,並沒有利用許多「純粹」的Prolog特性。Conway的人生遊戲的最新序幕實現是什麼?
只要運行它,然後按Enter鍵,每次都可以輸入下一代。
有一個版本(曲折的比例)Here
一件事攻擊與Prolog的問題時,我注意到的是,總有(的時間以及99%)整潔的實現,而且感覺就像那這次的情況。
您能想到的任何更好的實現?我對我不滿意。它的工作原理,並不是非常低效(?),但仍然...
似乎我可以更好地利用統一即。與其將鄰居視爲X,Y相對於我單獨檢查的任何給定單元格進行協調,我可能會以某種方式讓Prolog爲我完成一些繁重的工作。
% Conway Game of Life (Stack Overflow, 'magus' implementation)
% The life grid, 15x15
grid([
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,1,0,1,0,1,0,0,0,0,0],
[0,0,0,0,0,1,0,0,0,1,0,0,0,0,0],
[0,0,0,0,0,1,0,0,0,1,0,0,0,0,0],
[0,0,0,0,0,1,0,0,0,1,0,0,0,0,0],
[0,0,0,0,0,1,0,1,0,1,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
]
).
% Infinite generates sep with keystroke
% -------------------------------------
life(Grid) :-
dumpgen(Grid),
onegen(Grid, 0, NewGrid),
get_single_char(_),
life(NewGrid).
% Dumps a generation out
% ----------------------
dumpgen([]) :- nl.
dumpgen([H|T]) :-
write(H), nl,
dumpgen(T).
% Does one generation
% --------------------------------
onegen(_, 15, []).
onegen(Grid, Row, [NewRow|NewGrid]) :-
xformrow(Grid, Row, 0, NewRow),
NRow is Row + 1,
onegen(Grid, NRow, NewGrid).
% Transforms one row
% --------------------------------
xformrow(_, _, 15, []).
xformrow(Grid, Row, Col, [NewState|NewList]) :-
xformstate(Grid, Row, Col, NewState),
NewCol is Col + 1,
xformrow(Grid, Row, NewCol, NewList).
% Request new state of any cell
% --------------------------------
xformstate(Grid, Row, Col, NS) :-
cellstate(Grid, Row, Col, CS),
nextstate(Grid, Row, Col, CS, NS).
% Calculate next state of any cell
% --------------------------------
% Cell is currently dead
nextstate(Grid, Row, Col, 0, NS) :-
neightotal(Grid, Row, Col, Total),
(Total =:= 3 -> NS = 1 ; NS = 0).
% Cell is currently alive
nextstate(Grid, Row, Col, 1, NS) :-
neightotal(Grid, Row, Col, Total),
((Total =:= 2; Total =:=3)
-> NS = 1; NS = 0).
% State of all surrounding neighbours
%-------------------------------------
neightotal(Grid, Row, Col, TotalSum) :-
% Immediately neighbours X, Y
XM1 is Col - 1,
XP1 is Col + 1,
YM1 is Row - 1,
YP1 is Row + 1,
% State at all those compass points
cellstate(Grid, YM1, Col, N),
cellstate(Grid, YM1, XP1, NE),
cellstate(Grid, Row, XP1, E),
cellstate(Grid, YP1, XP1, SE),
cellstate(Grid, YP1, Col, S),
cellstate(Grid, YP1, XM1, SW),
cellstate(Grid, Row, XM1, W),
cellstate(Grid, YM1, XM1, NW),
% Add up the liveness
TotalSum is N + NE + E + SE + S + SW + W + NW.
% State at any given row/col - 0 or 1
% -----------------------------------
% Valid range, return it's state
cellstate(Grid, Row, Col, State) :-
between(0, 14, Row),
between(0, 14, Col),
nth0(Row, Grid, RL),
nth0(Col, RL, State).
% Outside range is dead
cellstate(_, _, _, 0).
執行:
[debug] ?- grid(X), life(X).
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
[0,0,0,0,0,1,0,1,0,1,0,0,0,0,0]
[0,0,0,0,0,1,0,0,0,1,0,0,0,0,0]
[0,0,0,0,0,1,0,0,0,1,0,0,0,0,0]
[0,0,0,0,0,1,0,0,0,1,0,0,0,0,0]
[0,0,0,0,0,1,0,1,0,1,0,0,0,0,0]
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
[0,0,0,0,0,0,1,0,1,0,0,0,0,0,0]
[0,0,0,0,1,1,0,0,0,1,1,0,0,0,0]
[0,0,0,0,1,1,1,0,1,1,1,0,0,0,0]
[0,0,0,0,1,1,0,0,0,1,1,0,0,0,0]
[0,0,0,0,0,0,1,0,1,0,0,0,0,0,0]
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
[0,0,0,0,0,1,0,0,0,1,0,0,0,0,0]
[0,0,0,0,1,0,0,0,0,0,1,0,0,0,0]
[0,0,0,1,0,0,1,0,1,0,0,1,0,0,0]
[0,0,0,0,1,0,0,0,0,0,1,0,0,0,0]
[0,0,0,0,0,1,0,0,0,1,0,0,0,0,0]
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
etc.
感謝您的時間查克莫寺廟 - 正是我一直在尋找的 - 看着,我已經沒有考慮這個問題的不同方式。做得好! – magus 2012-02-19 10:46:56