2013-06-11 202 views
0

我已經解決了使用ECLiPSe在會議中分配文章的問題。目標是:類似的文章應該在同一屆會議上。 這是在Eclipse工作溶液:將ECLiPSe移植到Prolog

:- 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使用傳播算法,但在序言中我必須使用回溯策略。

如何在prolog中移植此代碼?

回答

3

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

其他謂詞按原樣工作。您也可以使用labeling/2而不是label/1,它可以提供對約束搜索算法的額外控制。

+0

嗯,在我的情況下是不允許使用外部庫的,因爲我必須在純序言中自己編寫約束求解器。 – user840718

+0

@ user840718:那麼問題是什麼?只需通過「member/2」或「nth1/3」調用來替換約束並進行檢查。 –

+0

你說得對,但代碼太陳述了。 我需要實施解決約束,生成和測試或標準回溯的策略。 我不知道算法的實現,所以我不能使用外部庫並實現它。 – user840718