Prolog约束
Prolog constraint
我有 3 个列表约束:
- 列表插入 1..9
- all_different(列表)
lists in the list --> 我从列表中得到了一些列表。列表中的每个列表都必须满足无缝约束。例如:
列表 1 = [1,3,2,4];
清单 2=[3,2,1];
列表 3= [5,7,6]
错误:List4=[1,4,3]
1 问题:您有设置约束 3 的想法吗?我会对列表进行排序并检查:Element1=Element2+1?
毕竟我想使用标签([ff],list)
2 问题:如果我按照我的想法设置约束 3,我会得到一个带标签的解决方案吗?
我认为这与您正在寻找的内容一致...
:- 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).
这些谓词生成满足条件的所有可能列表,并且当且仅当给定列表满足条件时才会成功。
这可能也是您要查找的内容。没有排序,只使用 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
| ?-
免责声明:这个问题很难理解。
我有 3 个列表约束:
- 列表插入 1..9
- all_different(列表)
lists in the list --> 我从列表中得到了一些列表。列表中的每个列表都必须满足无缝约束。例如:
列表 1 = [1,3,2,4];
清单 2=[3,2,1];
列表 3= [5,7,6]
错误:List4=[1,4,3]
1 问题:您有设置约束 3 的想法吗?我会对列表进行排序并检查:Element1=Element2+1?
毕竟我想使用标签([ff],list)
2 问题:如果我按照我的想法设置约束 3,我会得到一个带标签的解决方案吗?
我认为这与您正在寻找的内容一致...
:- 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).
这些谓词生成满足条件的所有可能列表,并且当且仅当给定列表满足条件时才会成功。
这可能也是您要查找的内容。没有排序,只使用 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
| ?-
免责声明:这个问题很难理解。