最一般的高階約束,描述相對于關系有序的整數序列。在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
提交
取消