我对列表有3个约束:
列表中的列表 - >我从列表中得到了一些列表。列表中的每个列表都必须满足无约束的约束。例如:
List1 = [1,3,2,4];
列表2 = [3,2,1];
List3 = [5,7,6]
错误:List4 = [1,4,3]
1问题:您有设置约束3的想法吗?我会对列表进行排序并检查:Element1 = Element2 + 1?
毕竟我想使用标签([ff],list)
2问题:如果我像我的想法一样设置约束3,我会得到带标签的解决方案吗?
答案 0 :(得分:2)
我认为这与您正在寻找的内容相符......
:- use_module(library(clpfd)).
foo(L) :-
Len in 1..9, % lists of length 1 through 9
length(L, Len),
L ins 1..9,
label(L),
msort(L, LS),
series(LS).
series([_]).
series([X,Y|T]) :- Y #= X + 1, series([Y|T]).
由于您已将列表限制为特定的系列行为,因此表明all_different
将是多余的。
另一种方法可能是:
foo(L) :-
[Fst,Lst] ins 1..9,
Fst #=< Lst,
Len #= Lst - Fst + 1,
length(L, Len),
label([Fst,Lst]),
L ins Fst..Lst,
all_different(L),
label(L).
这些谓词会生成符合条件的所有可能列表,并且当且仅当给定列表符合条件时才会成功。
答案 1 :(得分:2)
这也可能是您正在寻找的。没有排序,只需使用maximum
和minimum
:
:- use_module(library(clpfd)).
listl( LSize, List ) :-
length( List, LSize ),
domain(List, 1, 9),
maximum( MaxL, List ),
minimum( MinL, List ),
all_different(List),
LSize #= MaxL - MinL + 1,
labeling( [], List ).
通过一个小测试:
| ?- listl( 4, L ).
L = [1,2,3,4] ? ;
L = [1,2,4,3] ? ;
L = [1,3,2,4] ? ;
L = [1,3,4,2] ?
yes
| ?-
免责声明:这个问题很难理解。