Ограничение домена для переменной через список

У меня есть список, определенный в одной части моей программы как

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

Я хотел бы ограничить переменную N значениями в этом домене. Что-то типа :

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

В настоящее время Prolog жалуется на «вызов неопределенной процедуры Group :: [....] в eclipse. Abort»

Я просмотрел документацию SWI-Prolog для lib(clpfd) и lib(lists) и других источников, но не нашел подходящего способа сделать это. Любые подсказки?


person ZM-    schedule 02.05.2019    source источник


Ответы (1)


Из вашего сообщения об ошибке я делаю вывод, что вы используете ECLiPSe, поэтому вы можете обратиться к документации ECLiPSe, а не SWI-Пролог;)

Большинство реализаций решателя ограничений конечной области ограничивают себя целочисленными доменами, поэтому вам придется кодировать имена ваших людей как целые числа. Однако ECLiPSe предоставляет минималистский решатель для символических доменов, который вы могли бы использовать для ваших первых экспериментов:

:- 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)
...

Для дальнейшей работы вы, вероятно, захотите переключиться на библиотеку(ic), которая работает с целочисленными/реальными доменами (вместо символов), но имеет больше возможностей.

person jschimpf    schedule 02.05.2019