将ECLiPSe移植到Prolog
我使用ECLiPSe解决了一个关于会议中文章分配的问题。目标是:类似的文章应该在相同的会话中。 这是在ECLiPSe中工作的解决方案:将ECLiPSe移植到Prolog,prolog,clpfd,eclipse-clp,Prolog,Clpfd,Eclipse Clp,我使用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 Lear
:- 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).
在prolog中,问题是约束的定义和标记。
我知道ECLiPSe使用传播算法,但在prolog中我必须使用回溯策略
如何在prolog中移植此代码?SWI prolog的实现支持ECLiPSe版本中的大部分功能,但语法有所不同。以下是
会议
:
:- 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
,它提供了对约束搜索算法的额外控制。SWI Prolog有一个实现,它支持ECLiPSe版本中的大部分功能,但语法有所不同。以下是会议
:
:- 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
,它提供了对约束搜索算法的额外控制。在我的情况下,不允许使用外部库,因为我必须自己在纯prolog中编写约束解算器。@user840718:那么问题是什么?只需将约束替换为member/2
或nth1/3
调用和检查即可。您是对的,但代码过于声明性。我需要实现一个解决约束的策略,生成并测试或标准回溯。我不知道算法的实现,所以我不能使用外部库来实现它。@user840718:True。想想看,完全不同
,域约束可能应该被置换/2
取代。其余的代码将不得不重新调整,直到它工作,然后优化;但这是可以通过一些指导性的尝试和错误来实现的。在我的情况下,不允许使用外部库,因为我必须自己用纯prolog编写约束解算器。@user840718:那么问题是什么?只需将约束替换为member/2
或nth1/3
调用和检查即可。您是对的,但代码过于声明性。我需要实现一个解决约束的策略,生成并测试或标准回溯。我不知道算法的实现,所以我不能使用外部库来实现它。@user840718:True。想想看,完全不同
,域约束可能应该被置换/2
取代。其余的代码将不得不重新调整,直到它工作,然后优化;但这是可以通过一些指导性的尝试和错误来实现的。