【问题标题】:Constraining domain for variable through list通过列表约束变量域
【发布时间】:2019-05-02 09:20:19
【问题描述】:

我在程序的一部分中定义了一个列表

people([tom,betty,sue,fred,charles,chay])

我想将一个变量限制为该域中的 N 个值。 类似的东西:

setup(GroupCount) :-
    length(Group, GroupCount),
    people(X),
    Group :: X,
    all_different(Group),
    <other predicates>.

目前,Prolog 抱怨“在 eclipse.Abort 中调用未定义的过程 Group :: [....]”

我查看了 lib(clpfd) 和 lib(lists) 以及其他地方的 SWI-Prolog 文档,但找不到合适的方法。有什么线索吗?

【问题讨论】:

    标签: prolog constraint-programming clpfd


    【解决方案1】:

    根据您的错误消息,我推断您正在使用 ECLiPSe,因此您可能需要参考 ECLiPSe's documentation 而不是 SWI-Prolog 的 ;)

    大多数有限域约束求解器实现将自己限制为整数域,因此您必须将人名编码为整数。但是,ECLiPSe 确实提供了 minimalist solver for symbolic domains,您可以将其用于您的第一次实验:

    :- lib(sd).    % load symbolic finite-domain solver
    
    people([tom,betty,sue,fred,charles,chay]).
    
    setup(GroupCount, Group) :-
        length(Group, GroupCount),
        people(X),
        Group &:: X,
        alldifferent(Group),
        labeling(Group).
    

    其工作原理如下

    ?- setup(3, G).
    G = [betty, charles, chay]
    Yes (0.00s cpu, solution 1, maybe more)
    G = [betty, charles, fred]
    Yes (0.00s cpu, solution 2, maybe more)
    ...
    

    对于进一步的工作,您可能希望切换到library(ic),它适用于整数/实数域(而不是符号),但功能更丰富。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 2016-02-21
      • 1970-01-01
      • 1970-01-01
      • 2021-09-12
      相关资源
      最近更新 更多