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.