最一般的高阶约束,描述相对于关系有序的整数序列。在CLP(FD)中,我们经常需要声明:“这是整数和有限域变量的列表(有时:严格)上升/降序。“是否有任何CLP(FD)系统为此任务提供一个通用(可参数化)内置约束?Swi-prolog提供了一个名为chain/2,这和我要找的东西很相似。但是,名称过于具体,不能包含约束可以描述的所有关系(例如:#<不是偏序,但在chain/2,导致序列-作为一组整数-不再像数学秩序理论中定义的链那样计算)。因此,名称并不完全描述约束实际实现的内容。请给最一般定义通常的二进制CLP(FD)约束-或至少包含以下内容的适当子集#<, #>, #=<和#>= — 包括根据约束定义的代数结构指定的专有名称。施加的条件是,约束描述实际数学结构,在文献中有正确名称的数学结构。首先,考虑使用SICStus Prolog或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).抽样案例:?- 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.请注意,允许#\=,因为这种关系仍然描述在数学秩序理论中所知的康奈。因此,对于通常的二进制CLP(FD)约束,上面的代码并不是最通用的。
3 回答
慕工程0101907
TA贡献1887条经验 获得超5个赞
foldcmpl
length list
isSortedBy
isSortedBy函数返回True当且仅当谓词返回列表中所有相邻元素对的true。
all_adjacent_pairs(R_2, Xs)
adjacent_pair
翻翻过去那场雪
TA贡献2065条经验 获得超14个赞
mapadj/4
forallAdj(P_2,Xs) :- list_forallAdj(Xs,P_2). list_forallAdj([],_). list_forallAdj([X|Xs],P_2) :- list_forallAdj_prev(Xs,P_2,X). list_forallAdj_prev([],_,_). list_forallAdj_prev([X1|Xs],P_2,X0) :- call(P_2,X0,X1), list_forallAdj_prev(Xs,P_2,X1).
:- use_module(library(clpfd)). :- use_module(library(lambda)). ?- Ls = [0,_,_,_,_,_], forallAdj(\X0^X1^(X0 + 1 #= X1), Ls). Ls = [0, 1, 2, 3, 4, 5].
forallAdj
=>existAdj
可能有索引的变体( forallAdjI
,existAdjI
)像. findfirstAdj
/pickfirstAdj
也像F# find
/pick
添加回答
举报
0/150
提交
取消