Occhio che il separatore della lista è ; e non , (l1).
In ogni caso se non dovesse essere l'unico problema questa funzione funziona (spush):
codice:
let g1 = [(1,2,0,5);(2,3,0,3);(2,4,0,3);(2,5,0,5);(3,6,0,1);(5,6,0,2);(4,7,0,3)];;

let push n t = 
	match t with
		|(a,b,c,d) -> (a,b,c+n,d);;

let l1 = [1;3;5];;

let rec spush_aus n xss lss k =
	match xss with
		|x::xs -> 
			(match lss with
				|l::ls -> if l == k 
						  then (push n x)::spush_aus n xs ls (k+1) 
						  else x::spush_aus n xs (l::ls) (k+1)
				|[] -> xs
			)
		|[] -> [];;

let spush n xss lss = spush_aus n xss (List.sort compare lss) 0;;
Se non dovessero esserci tutti gli elementi corrispondenti agli indici in lss questa funzione ritorna normalmente, puoi cambiare il suo operato modificando il match esterno di spush_aus; Inoltre considera come primo elemento l'elemento 0, per fare diversamente ti basta sostituire a 0 il numero che intendi considerare come numero di partenza (suppongo 1 nel caso) nell'ultima riga di codice...

Devo dire che non sono molto soddisfatto di questo codice, ma era da due anni che non vedevo una riga di ocaml (e prima non l'avevo approfondito tantissimo) quindi prendilo come viene

Devo inoltre aggiungere che questa soluzione non è tail recursive, quindi potrebbe provocare stack overflow su liste lunghe, ma puoi trasformarla in tale con un piccolo sforzo...

Grazie perchè devi le discussioni del forum dai soliti linguaggi comuni (eg: C, C++...) a qualcosa che dia più soddisfazione!