gpt4 book ai didi

prolog - 最通用的高阶约束,描述相对于关系排序的整数序列

转载 作者:行者123 更新时间:2023-12-03 01:28:53 26 4
gpt4 key购买 nike

在 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) 约束来说并不是最通用的。

最佳答案

Hoogle 不是很有用,但是Hayoo is!

foldcmpl

所以这是列表折叠的一种特殊形式,但它不应用 length list 次,而是少应用一次。

isSortedBy

其名称并不完全通用,但其签名却是通用的。也许坚持使用最通用的名称并没有多大帮助。否则我们就只有实体了?

定义如下:

The isSortedBy function returns True iff the predicate returns true for all adjacent pairs of elements in the list.

也许:all_adjacent_pairs(R_2, Xs)。在使用以 adjacent_pair 作为某些修饰符的循环构造之后,这听起来有点像。

关于prolog - 最通用的高阶约束,描述相对于关系排序的整数序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26990728/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com