Перенос ECLiPSe на Prolog

Решил задачу о размещении статей на конференции с помощью 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 использует алгоритмы распространения, но в прологе я должен использовать стратегии обратного отслеживания.

Как мне перенести этот код в пролог?


person user840718    schedule 11.06.2013    source источник


Ответы (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 можно также использовать _ 4_, который предлагает дополнительный контроль над алгоритмом поиска по ограничению.

person Fred Foo    schedule 11.06.2013
comment
Что ж, в моем случае не разрешено использовать внешнюю библиотеку, потому что я должен сам написать решатель ограничений в чистом прологе. - person user840718; 11.06.2013
comment
@ user840718: тогда в чем вопрос? Просто замените ограничения member/2 или nth1/3 вызовами и проверками. - person Fred Foo; 11.06.2013
comment
Вы правы, но код слишком декларативен. Мне нужно реализовать стратегию разрешения ограничений, генерировать и тестировать или стандартный возврат. Я не знаю, как реализован алгоритм, поэтому не могу использовать внешнюю библиотеку и реализовать ее. - person user840718; 12.06.2013
comment
@ user840718: Верно. Если подумать, all_different и ограничения домена, вероятно, следует заменить на permutation/2. Остальной код придется перетасовать, пока он не заработает, а затем оптимизировать; но это можно сделать методом проб и ошибок. - person Fred Foo; 12.06.2013