Prolog约束

Prolog constraint

我有 3 个列表约束:

  1. 列表插入 1..9
  2. all_different(列表)
  3. 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).

这些谓词生成满足条件的所有可能列表,并且当且仅当给定列表满足条件时才会成功。

这可能也是您要查找的内容。没有排序,只使用 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
| ?- 

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