Prolog约束

时间:2015-02-12 06:49:04

标签: prolog constraints clpfd

我对列表有3个约束:

  1. list ins 1..9
  2. all_different(列表)
  3. 列表中的列表 - >我从列表中得到了一些列表。列表中的每个列表都必须满足无约束的约束。例如:

    List1 = [1,3,2,4];
    列表2 = [3,2,1];
    List3 = [5,7,6]
    错误:List4 = [1,4,3]

  4. 1问题:您有设置约束3的想法吗?我会对列表进行排序并检查:Element1 = Element2 + 1?

    毕竟我想使用标签([ff],list)

    2问题:如果我像我的想法一样设置约束3,我会得到带标签的解决方案吗?

2 个答案:

答案 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)

这也可能是您正在寻找的。没有排序,只需使用maximumminimum

:- 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
| ?- 

免责声明:这个问题很难理解。