hex(HexSize, Point, Dist, Neighbours) :- column_of_point(HexSize, Point,1,ColNr,ColSize,1,ColMin), UpD is Point - ColMin + Dist, LowD is Point - ColMin - Dist, LeftStop is max(1,ColNr-Dist), RightStop is min(ColNr+Dist,2*HexSize - 1), addmoreleft(UpD,LowD,HexSize,ColNr,ColMin,ColSize, LeftStop,Dist,Acc,Neighbours), add(ColMin, ColSize, UpD, LowD, Acc1, Acc), addmoreright(UpD,LowD,HexSize,ColNr,ColMin,ColSize, RightStop,Dist,Acc1). column_of_point(HexSize,Point,CurrentColNr,PointColNr,ColSize, CurrentColMin,ColMin) :- col_size(CurrentColNr,HexSize,CurrentColSize), NextColMin is CurrentColMin + CurrentColSize, ( Point < NextColMin -> PointColNr = CurrentColNr, ColMin = CurrentColMin, ColSize = CurrentColSize ; NextColNr is CurrentColNr + 1, column_of_point(HexSize,Point,NextColNr,PointColNr,ColSize, NextColMin,ColMin) ). col_size(Col,HexSize,ColSize) :- ( Col =< HexSize -> ColSize is HexSize + Col - 1 ; ColSize is 3*HexSize - Col - 1 ). addmoreleft(UpD,LowD,HexSize,ColNr,ColMin,ColSize,Stop,Dist,Acc,Result) :- ( Stop == ColNr -> Result = Acc ; ColNr1 is ColNr - 1, ( ColNr > HexSize -> LowD1 is LowD + 1, UpD1 = UpD, ColSize1 is ColSize + 1 ; UpD1 is UpD - 1, LowD1 = LowD, ColSize1 is ColSize - 1 ), ColMin1 is ColMin - ColSize1, ( Dist == 1 -> addall(LowD1,UpD1,ColMin1,ColSize1,Acc,Result) ; add(ColMin1,ColSize1,UpD1,LowD1,Acc,Acc1), Dist1 is Dist - 1, addmoreleft(UpD1,LowD1,HexSize,ColNr1,ColMin1, ColSize1,Stop,Dist1,Acc1,Result) ) ). addall(LowD,UpD,Min,ColSize,Tail,List) :- From is max(Min,Min+LowD), To is min(Min+ColSize-1,Min+UpD), interval(From,To,Tail,List). add(ColMin,ColSize,UpD,LowD,Acc,Acc1) :- P1 is ColMin + UpD, P2 is ColMin + LowD, ( ColMin =< P1, P1 < ColMin + ColSize -> Ns = [P1|Acc] ; Ns = Acc ), ( ColMin =< P2, P2 < ColMin + ColSize, P1 \== P2 -> Acc1 = [P2|Ns] ; Acc1 = Ns ). addmoreright(UpD,LowD,HexSize,ColNr,ColMin,ColSize,Stop,Dist,Result) :- ( Stop == ColNr -> Result = [] ; ColNr1 is ColNr + 1, ( ColNr < HexSize -> LowD1 is LowD + 1, UpD1 = UpD, ColSize1 is ColSize + 1 ; UpD1 is UpD - 1, LowD1 = LowD, ColSize1 is ColSize - 1 ), ColMin1 is ColMin + ColSize, ( Dist == 1 -> addall(LowD1,UpD1,ColMin1,ColSize1,[],Result) ; add(ColMin1,ColSize1,UpD1,LowD1,Result1,Result), Dist1 is Dist - 1, addmoreright(UpD1,LowD1,HexSize,ColNr1,ColMin1, ColSize1,Stop,Dist1,Result1) ) ). interval(From,To,Tail,List) :- ( From > To -> List = Tail ; List = [From|Rest], From1 is From + 1, interval(From1,To,Tail,Rest) ).