最一般的高階約束,描述相對于關(guān)系有序的整數(shù)序列。在CLP(FD)中,我們經(jīng)常需要聲明:“這是整數(shù)和有限域變量的列表(有時:嚴格)上升/降序。“是否有任何CLP(FD)系統(tǒng)為此任務(wù)提供一個通用(可參數(shù)化)內(nèi)置約束?Swi-prolog提供了一個名為chain/2,這和我要找的東西很相似。但是,名稱過于具體,不能包含約束可以描述的所有關(guān)系(例如:#<不是偏序,但在chain/2,導(dǎo)致序列-作為一組整數(shù)-不再像數(shù)學(xué)秩序理論中定義的鏈那樣計算)。因此,名稱并不完全描述約束實際實現(xiàn)的內(nèi)容。請給最一般定義通常的二進制CLP(FD)約束-或至少包含以下內(nèi)容的適當子集#<, #>, #=<和#>= — 包括根據(jù)約束定義的代數(shù)結(jié)構(gòu)指定的專有名稱。施加的條件是,約束描述實際數(shù)學(xué)結(jié)構(gòu),在文獻中有正確名稱的數(shù)學(xué)結(jié)構(gòu)。首先,考慮使用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.請注意,允許#\=,因為這種關(guān)系仍然描述在數(shù)學(xué)秩序理論中所知的康奈。因此,對于通常的二進制CLP(FD)約束,上面的代碼并不是最通用的。
最一般的高階約束,描述相對于關(guān)系有序的整數(shù)序列。
ABOUTYOU
2019-06-21 16:26:11