(define (tally xs)
(define (aux acc xs)
(if (null? xs)
acc
(let* ((k (car xs))
(v (alist-ref k acc))
(a (alist-update k (+ 1 (or v 0)) acc)))
(aux a (cdr xs)))))
(aux '() xs))
(define (factorial n)
(define (aux acc n)
(if (= n 0)
acc
(aux (* acc n) (- n 1))))
(aux 1 n))
(define (n-permutations xs)
(/ (factorial (length xs)) (foldl (lambda (acc kv) (* acc (factorial (cdr kv)))) 1 (tally xs))))
(define (count f xs)
(foldl (lambda (acc x) (+ acc (if (f x) 1 0))) 0 xs))
(define (f xs)
(define (aux acc xs)
(if (null? xs)
acc
(let* ((c (count (lambda (x) (< x (car xs))) xs))
(p (n-permutations xs))
(w (length xs)))
(aux (+ acc (/ (* c p) w)) (cdr xs)))))
(aux 1 xs))
(print (f '(1 2 3 4 5 6 7 8 9)))
(print (f '(1 2 3 4 5 6 7 9 8)))
(print (f '(1 2 3 4 5 6 8 7 9)))
(print (f '(4 1 6 5 8 9 7 3 2)))
(print (f '(6 8 4 7 5 3 2 1 9)))
(print (f '(9 8 7 6 5 4 3 2 1)))
(print (f '(1 1 1 2 2 2 3 3 3 4 4 4)))
(print (f '(1 1 1 2 2 2 3 3 4 3 4 4)))
(print (f '(1 1 1 2 2 2 3 3 4 4 3 4)))
(print (f '(2 2 2 3 3 1 4 3 4 1 1 4)))
(print (f '(3 2 4 4 2 4 3 3 1 1 1 2)))
(print (f '(4 4 4 3 3 3 2 2 2 1 1 1)))
(print (f '(3 1 4 1 5 9)))