Sorted. Ended up with this , for the record, probably not most efficient but the first error that gets found aborts the translation anyway.
pos_linecol(Src, Pos, (Line, Col)) :-
poslin(Src, Pos, 1, 0, Line, Col).
poslin(_, 0, Lin, Cin, Lin, Cin) :- !.
poslin([], _, Lin, Cin, Lin, Cin) :- !.
poslin([Chr|Cs], Pos, Lin, Cin, L, C) :-
chrpos(Chr, (Lin, Cin), (Lout, Cout)),
Pos1 is Pos-1,
poslin(Cs, Pos1, Lout, Cout, L, C).
chrpos(10,(L,_),(L1,0)) :- L1 is L+1, !.
chrpos(_, (L,C),(L,C1)) :- C1 is C+1.