Ограничение домена для переменной через список - PullRequest
0 голосов
/ 02 мая 2019

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

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

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

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

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

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

1 Ответ

2 голосов
/ 02 мая 2019

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

Большинство реализаций решателя ограничений в конечных доменахограничьте себя целочисленными доменами, поэтому вам придется кодировать имена людей как целые числа.Однако 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) , которая работает с целочисленными / действительными доменами (вместо символов), но более многофункциональна.

...