prolog clpfd:
:- use_module(library(clpfd)).
list_factorial([1], 0).
list_factorial(Zs0, N) :-
length(Zs0, N),
N #> 0,
list_n_fac(Zs0, 1, 1).
list_n_fac([], _, _).
list_n_fac([Z1|Zs], N0, Z0) :-
Z1 #= Z0 * N0,
N1 #= N0 + 1,
list_n_fac(Zs, N1, Z1).
:
?- list_factorial(Zs, 8).
Zs = [1,2,6,24,120,720,5040,40320].
:
?- list_factorial(Zs, N).
( N = 0, Zs = [1]
; N = 1, Zs = [1]
; N = 2, Zs = [1,2]
; N = 3, Zs = [1,2,6]
; N = 4, Zs = [1,2,6,24]
; N = 5, Zs = [1,2,6,24,120]
...