相关疑难解决方法(0)

最常见的高阶约束描述了关于关系排序的整数序列

在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).
Run Code Online (Sandbox Code Playgroud)

示例案例:

?- connex(#<, [A,B,C]).
A#=<B+-1,
B#=<C+-1.

?- connex(#=, [A,B,C]).
A = B, B = C,
C in inf..sup. …
Run Code Online (Sandbox Code Playgroud)

topology prolog clpfd meta-predicate

22
推荐指数
2
解决办法
1114
查看次数

列表中的数字小于给定数字

xMenores(_,[],[]).
xMenores(X,[H|T],[R|Z]) :-
   xMenores(X,T,Z),
   X > H,
   R is H.
Run Code Online (Sandbox Code Playgroud)

xMenores 有三个参数:

  • 第一个是数字.
  • 第二个是数字列表.
  • 第三个是列表,是包含结果的变量.

该规则的目标xMenores是获得一个列表,其中列表的编号(第二个参数)小于第一个参数的值.例如:

?- xMenores(3,[1,2,3],X).
X = [1,2].                        % expected result
Run Code Online (Sandbox Code Playgroud)

问题是xMenores返回falseX > H是假的,我的编程技巧在prolog几乎为空.所以:

?- xMenores(4,[1,2,3],X).
X = [1,2,3].                      % Perfect.

?- xMenores(2,[1,2,3],X).
false.                            % Wrong! "X = [1]" would be perfect.
Run Code Online (Sandbox Code Playgroud)

我认为X > H, R is H.因为我需要的只要X大于H,R取值H.但我不知道像Prolog中的if或者某种控制结构来处理这个问题.

请问,任何解决方案?谢谢.

list prolog

13
推荐指数
5
解决办法
2024
查看次数

标签 统计

prolog ×2

clpfd ×1

list ×1

meta-predicate ×1

topology ×1