如何用tkEclipse从Prolog约束满足问题代码生成展示矩阵?
使用tkEclipse可视化Prolog约束满足问题的状态矩阵
我是Prolog新手,手里有一段约束满足问题的Prolog代码,希望借助tkEclipse(Prolog版Eclipse)生成包含前后状态的展示矩阵(类似指定示例图片的样式)。以下是对应的约束满足问题代码:
:- lib(ic). :- lib(ech). :- local struct(fms(f1, f2, f3, f4)). :- local struct(fcs(pc1, cc1, hc2, pc2, hc3, pc4, cc4)). :- local struct(part_family(fms, fcs, fvs, rms, prs)). :- local struct(rms(rm1, rm2, rm3, rm4, rm5, rm6, rm7)). :- local struct(fvs(pc1_1, pc1_2, cc1_1, cc1_2, hc2_1, hc2_2, pc2_1, hc3_1, pc4_1, pc4_2, cc4_1)). :- local struct(prs(pr1, pr2, pr3, pr4, pr5, pr6)). constraints cc1/3, cc2/4, cc3/4, cc4/4, cc11/3, cc12/4. cc1(A:L, B:M, Active)<=>memberd(A:L, Active),memberd(B:M, Active)|L $= M. cc11(A:L, B:M, Active)<=>memberd(A:L, Active)|L $= M. cc11(A:L, B:M, Active)<=>not memberd(A:L, Active)|M = 0. cc12(A:L, B:M, C:N, Active)<=>memberd(A:L, Active),memberd(B:M, Active)|N $= (L and M). cc12(A:L, B:M, C:N, Active)<=>not memberd(A:L, Active)|N = 0. cc12(A:L, B:M, C:N,Active)<=>not memberd(B:M, Active)|N = 0. cc2(A:L, B:M, C:N, Active)<=>memberd(A:L, Active), memberd(B:M, Active), memberd(C:N, Active)|L $= (M and N). cc3(A:L, B:M, C:N, Active)<=>memberd(A:L, Active), memberd(B:M, Active), memberd(C:N, Active)|L $= ((M and N) or (neg M and N)). cc4(A:L, B:M, C:N, Active)<=>memberd(A:L, Active), memberd(B:M, Active), memberd(C:N, Active)|L $= ((M and neg N) or (neg M and N)). solve_dcsp(part_family(fms(f1:F1,f2:F2,f3:F3,f4:F4), fcs(pc1:PC1,cc1:CC1,hc2:HC2,pc2:PC2,hc3:HC3,pc4:PC4,cc4:CC4), fvs(pc1_1:PC1_1, pc1_2:PC1_2, cc1_1:CC1_1, cc1_2:CC1_2, hc2_1:HC2_1, hc2_2:HC2_2, pc2_1:PC2_1, hc3_1:HC3_1, pc4_1:PC4_1, pc4_2:PC4_2, cc4_1:CC4_1), rms(rm1:RM1,rm2:RM2,rm3:RM3,rm4:RM4,rm5:RM5,rm6:RM6,rm7:RM7), prs(pr1:PR1,pr2:PR2,pr3:PR3,pr4:PR4,pr5:PR5,pr6:PR6))):- [F1,F2,F3,F4]::[0,1], [PC1,CC1,HC2,PC2,HC3,PC4,CC4]::[0,1], [PC1_1,PC1_2,CC1_1,CC1_2,HC2_1,HC2_2,PC2_1,HC3_1,PC4_1,PC4_2,CC4_1]::[0,1], [RM1,RM2,RM3,RM4,RM5,RM6,RM7]::[0,1], [PR1,PR2,PR3,PR4,PR5,PR6]::[0,1], Active = [f1:F1,f2:F2,f3:F3,f4:F4], ((F1 and F2 and F3 and neg F4) or (F1 and F2 and neg F3 and F4)) $=1, find_solution(Active), activate(f1:F1,[pc1:PC1,cc1:CC1],Active,New_active1), activate(f2:F2,[pc2:PC2,hc2:HC2],New_active1,New_active2), activate(f3:F3,[hc3:HC3],New_active2,New_active3), activate(f4:F4,[pc4:PC4,cc4:CC4],New_active3,New_active4), cc2(f1:F1,pc1:PC1,cc1:CC1,New_active4), cc3(f2:F2,pc2:PC2,hc2:HC2,New_active4), cc2(f4:F4,pc4:PC4,cc4:CC4,New_active4), cc1(f3:F3,hc3:HC3,New_active4), find_solution(New_active4), activate(pc1:PC1,[pc1_1:PC1_1,pc1_2:PC1_2],New_active4,New_active5), activate(cc1:CC1,[cc1_1:CC1_1,cc1_2:CC1_2],New_active5,New_active6), activate(pc2:PC2,[pc2_1:PC2_1],New_active6,New_active7), activate(hc2:HC2,[hc2_1:HC2_1,hc2_2:HC2_2],New_active7,New_active8), activate(hc3:HC3,[hc3_1:HC3_1],New_active8,New_active9), activate(pc4:PC4,[pc4_1:PC4_1,pc4_2:PC4_2],New_active9,New_active10), activate(cc4:CC4,[cc4_1:CC4_1],New_active10,New_active11), cc4(pc1:PC1,pc1_1:PC1_1,pc1_2:PC1_2,New_active11), cc4(cc1:CC1,cc1_1:CC1_1,cc1_2:CC1_2,New_active11), cc1(pc2:PC2,pc2_1:PC2_1,New_active11), cc4(hc2:HC2,hc2_1:HC2_1,hc2_2:HC2_2,New_active11), cc1(hc3:HC3,hc3_1:HC3_1,New_active11), cc2(pc4:PC4,pc4_1:PC4_1,pc4_2:PC4_2,New_active11), cc1(cc4:CC4,cc4_1:CC4_1,New_active11), cc1(pc1_1:PC1_1,cc1_1:CC1_1,New_active11), cc1(pc1_2:PC1_2,pc2_1:PC2_1,New_active11), cc1(pc1_1:PC1_1,hc3_1:HC3_1,New_active11), cc1(pc1_1:PC1_1,hc2_1:HC2_1,New_active11), cc1(pc1_2:PC1_2,f4:F4,New_active11), cc1(pc1_2:PC1_2,pc2:PC2,New_active11), find_solution(New_active11), cc11(pc1:PC1,rm1:RM1,New_active11), cc11(cc1:CC1,rm2:RM2,New_active11), cc11(pc2:PC2,rm3:RM3,New_active11), cc11(hc2:HC2,rm4:RM4,New_active11), cc11(hc3:HC3,rm5:RM5,New_active11), cc11(pc4:PC4,rm6:RM6,New_active11), cc11(cc4:CC4,rm7:RM7,New_active11), cc12(hc2:HC2,pc1:PC1,pr1:PR1,New_active11), cc12(pc1:PC1,cc1:CC1,pr2:PR2,New_active11), cc12(hc2:HC2,hc3:HC3,pr3:PR3,New_active11), cc12(hc2:HC2,pc4:PC4,pr4:PR4,New_active11), cc12(pc4:PC4,cc4:CC4,pr5:PR5,New_active11), cc11(pc4:PC2,pr6:PR6,New_active11), find_solution([rm1:RM1, rm2:RM2, rm3:RM3, rm4:RM4, rm5:RM5, rm6:RM6, rm7:RM7, pr1:PR1, pr2:PR2, pr3:PR3, pr4:PR4, pr5:PR5, pr6:PR6]), print_configuration(part_family(fms(f1:F1, f2:F2, f3:F3, f4:F4), fcs(pc1:PC1, cc1:CC1, hc2:HC2, pc2:PC2, hc3:HC3, pc4:PC4, cc4:CC4), fvs(pc1_1:PC1_1, pc1_2:PC1_2, cc1_1:CC1_1, cc1_2:CC1_2, hc2_1:HC2_1, hc2_2:HC2_2, pc2_1:PC2_1, hc3_1:HC3_1, pc4_1:PC4_1, pc4_2:PC4_2, cc4_1:CC4_1), rms(rm1:RM1, rm2:RM2, rm3:RM3, rm4:RM4, rm5:RM5, rm6:RM6, rm7:RM7), prs(pr1:PR1, pr2:PR2, pr3:PR3, pr4:PR4, ...))).
注:代码末尾存在截断,完整的
print_configuration调用参数未完全给出,但核心逻辑已呈现。
内容的提问来源于stack exchange,提问作者Sohail
相关产品推荐
相关产品推荐

