最一般的高阶约束,描述相对于关系有序的整数序列。

最一般的高阶约束,描述相对于关系有序的整数序列。

在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)约束,上面的代码并不是最通用的。


ABOUTYOU
浏览 664回答 3
3回答

慕工程0101907

胡格尔不是很有用,但是是的!foldcmpl这是一种特殊的折叠形式,但不适用。length list一次少一次。isSortedBy它的名字并不是完全通用的,而是在它的签名上。也许坚持使用最普通的名字也没什么用。否则我们就到处都是实体?定义如下:isSortedBy函数返回True当且仅当谓词返回列表中所有相邻元素对的true。也许:all_adjacent_pairs(R_2, Xs)..,这听起来有点像循环构造adjacent_pair作为某种改性剂。

翻翻过去那场雪

与mapadj/4在先前的回答中.。也许这个名字更好。forallAdj(P_2,Xs)&nbsp;:- &nbsp;&nbsp;&nbsp;list_forallAdj(Xs,P_2). list_forallAdj([],_). list_forallAdj([X|Xs],P_2)&nbsp;:- &nbsp;&nbsp;&nbsp;list_forallAdj_prev(Xs,P_2,X). list_forallAdj_prev([],_,_). list_forallAdj_prev([X1|Xs],P_2,X0)&nbsp;:- &nbsp;&nbsp;&nbsp;call(P_2,X0,X1), &nbsp;&nbsp;&nbsp;list_forallAdj_prev(Xs,P_2,X1).样本使用::-&nbsp;use_module(library(clpfd)). :-&nbsp;use_module(library(lambda)). ?-&nbsp;Ls&nbsp;=&nbsp;[0,_,_,_,_,_],&nbsp;forallAdj(\X0^X1^(X0&nbsp;+&nbsp;1&nbsp;#=&nbsp;X1),&nbsp;Ls). Ls&nbsp;=&nbsp;[0,&nbsp;1,&nbsp;2,&nbsp;3,&nbsp;4,&nbsp;5].那能带我们去哪?forallAdj&nbsp;=>&nbsp;existAdj可能有索引的变体(forallAdjI,&nbsp;existAdjI)像.List模块(F#)findfirstAdj/pickfirstAdj也像F#find/pick
打开App,查看更多内容
随时随地看视频慕课网APP