Портирование ECLiPSe на Пролог
Я решил проблему с назначением статей на конференции, используя ECLiPSe. Цель: похожие статьи должны быть на одних и тех же сессиях. Это решение, которое работает в ECLiPSe:
:- lib(fd).
paper(1, 'An Empirical Study on Using Stereotypes to Improve Understanding of UML Models').
paper(2, 'Tool-Supported Customization of UML Class Diagrams for Learning Complex System Models').
paper(3, 'Understanding Class Evolution in Object-Oriented Software').
paper(4, 'A Simple Static Model for Understanding the Dynamic Behavior of Programs').
paper(5, 'Reuse in Reverse Engineering').
paper(6, 'Working in Pairs as a Means for Design Knowledge Building: An Empirical Study').
like(X, Y) :-
element(I, [1, 1, 2, 4, 4, 5], X),
element(I, [2, 3, 3, 5, 6, 6], Y).
conference([T1, T2, T3], [T4, T5, T6]) :-
% --- domains
L = [1, 2, 3, 4, 5, 6],
X1::L, X2::L, X3::L, X4::L, X5::L, X6::L,
% --- constraints
alldifferent([X1, X2, X3, X4, X5, X6]),
like(X1, X2), like(X1, X3), like(X2, X3), like(X4, X5), like(X4, X6), like(X5, X6),
% --- searching
labeling([X1, X2, X3, X4, X5, X6]),
% --- converting ids to titles
paper(X1, T1), paper(X2, T2), paper(X3, T3), paper(X4, T4), paper(X5, T5), paper(X6, T6).
В прологе проблема заключается в определении ограничений и маркировке. Я знаю, что ECLiPSe использует алгоритмы распространения, но в прологе я должен использовать стратегии обратного отслеживания.
Как я могу сделать портирование этого кода в прологе?
1 ответ
SWI-Prolog имеет реализацию CLP(FD), которая поддерживает большинство функций в версии ECLiPSe, но с несколько другим синтаксисом. Вот conference
:
:- use_module(library(clpfd)).
conference([T1, T2, T3], [T4, T5, T6]) :-
Domain = 1..6,
[X1, X2, X3, X4, X5, X6] ins Domain,
all_different([X1, X2, X3, X4, X5, X6]),
like(X1, X2), like(X1, X3), like(X2, X3),
like(X4, X5), like(X4, X6), like(X5, X6),
label([X1, X2, X3, X4, X5, X6]),
paper(X1, T1), paper(X2, T2),
paper(X3, T3), paper(X4, T4),
paper(X5, T5), paper(X6, T6).
Другие предикаты работают как есть. Вместо label/1
Вы также можете использовать labeling/2
, который предлагает дополнительный контроль над алгоритмом поиска ограничений.