A restrição de ordem superior mais geral que descreve uma sequência de números inteiros ordenados em relação a uma relação
No CLP (FD), frequentemente precisamos declarar: "Esta é uma lista de números inteiros e variáveis de domínio finito em (às vezes:estritamente) ordem crescente / decrescente ".
Existe algum sistema CLP (FD) que forneça uma restrição interna (parametrizável) geral para esta tarefa?
O SWI-Prolog fornece uma restrição chamadachain/2
, que é semelhante ao que estou procurando. No entanto, o nome é um pouco específico demais para abranger todas as relações que a restrição pode descrever (exemplo:#<
não é uma ordem parcial, mas admissível emchain/2
, levando à sequência - tomada como um conjunto de números inteiros - sem contar como uma cadeia, conforme definido na teoria da ordem matemática). Portanto, o nome não descreve completamente o que a restrição realmente implementa.
Por favor, dê omais geral definição com relação às restrições usuais de CLP binário (FD) - ou um subconjunto adequado que contenha pelo menos#<
, #>
, #=<
e#>=
— Incluindo o nome próprio de acordo com a estrutura algébrica que a restrição define. A condição imposta é que a restrição descreva umareal estrutura matemática que tem um nome próprio na literatura.
Para começar, considere com o SICStus Prolog ou SWI:
:- use_module(library(clpfd)).
connex(Relation_2, List) :-
connex_relation(Relation_2),
connex_(List, Relation_2).
connex_relation(#=).
connex_relation(#<).
connex_relation(#=<).
connex_relation(#>).
connex_relation(#>=).
connex_([], _).
connex_([L|Ls], Relation_2) :-
foldl(adjacent(Relation_2), Ls, L, _).
adjacent(Relation_2, X, Prev, X) :- call(Relation_2, Prev, X).
Casos de amostra:
?- connex(#<, [A,B,C]).
A#=<B+-1,
B#=<C+-1.
?- connex(#=, [A,B,C]).
A = B, B = C,
C in inf..sup.
?- maplist(connex(#<), [[A,B],[C,D]]).
A#=<B+-1,
C#=<D+-1.
Observe que seria admissível permitir#\=
, porque a relação seriaainda descrever um conexo como conhecido na teoria da ordem matemática. Portanto, o código acima não é mais geral em relação às restrições comuns de CLP binário (FD).