Pureza lógica de quando / 2 e terra / 1

A questã

Tenho uma pergunta relacionada à pureza lógic

Este programa é puro?

when(ground(X), X > 2).

Alguns [ir] detalhes relevantes sobre o contexto

Estou tentando escrever predicados puros com boas propriedades de terminação. Por exemplo, eu quero escrever um predicadolist_length/2 que descreve a relação entre uma lista e seu comprimento. Desejo obter o mesmo comportamento de terminação que o predicado internolength/2.

Minha pergunta procura descobrir se o seguinte predicado é puro:

list_length([], 0).
list_length([_|Tail], N):-
    when(ground(N), (N > 0, N1 is N - 1)),
    when(ground(N1), N is N1 + 1),
    list_length(Tail, N1).

Eu posso alcançar meu objetivo com clpfd ...

:- use_module(library(clpfd)).
:- set_prolog_flag(clpfd_monotonic, true).

list_length([], 0).
list_length([_|Tail], N):-
    ?(N) #> 0,
    ?(N1) #= ?(N) - 1,
    list_length(Tail, N1).

... ou posso usarvar/1, nonvar/1 e!/0, mas então éDifíci para provar que o predicado é pur

list_length([],0).
list_length([_|Tail], N):-
    nonvar(N), !,
    N > 0,
    N1 is N - 1,
    list_length(Tail, N1).
list_length([_|Tail], N):-
    list_length(Tail, N1),
    N is N1 + 1.

questionAnswers(1)

yourAnswerToTheQuestion