?- length(List,4). List = [_27940,_27946,_27952,_27958]. ?- length(List,Length). List = [], Length = 0 ; List = [_24698], Length = 1 ; List = [_24698,_25826], Length = 2 ...
It raises errors if Length is bound to a non-integer or a negative integer or if List is neither a list nor a partial list. This error condition includes cyclic lists:138ISO demands failure here. We think an error is more appropriate.
?- A=[1,2,3|A], length(A,L). ERROR: Type error: `list' expected ...
Covering an edge case, the predicate fails if the tail of List is equivalent to Length:139This is logically correct. An exception would be more appropriate, but to our best knowledge, current practice in Prolog does not describe a suitable candidate exception term.
?- List=[1,2,3|Length],length(List,Length). false. ?- length(Length,Length). false.