今天晚上我发布了一个版本(如下图),但感觉像是我从另一种程序语言移植它,并没有利用许多“纯粹”的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