【问题标题】:Prolog Logic Puzzle not working?Prolog 逻辑拼图不起作用?
【发布时间】:2018-09-26 22:51:25
【问题描述】:

我一直在研究这个 Prolog 逻辑问题。结果不正确,运行程序本身需要一段时间,这让我更担心。逻辑问题如下:

Alex、Bret、Chris、Derek、Eddie、Fred、Greg、Harold 和 John 是九名学生,他们住在一栋三层楼的大楼里,每层楼有三个房间。西厢房,中厢房,东厢房。直视建筑物,左侧为西,右侧为东。每个学生都被分配到一个房间。你能找到他们每个房间的位置吗?

  1. Harold 不住在底层。
  2. 弗雷德住在约翰的正上方和布雷特的旁边(他住在西翼)。
  3. Eddie 住在东翼,比 Fred 高一层。
  4. 德里克住在弗雷德的正上方。
  5. 格雷格住在克里斯的正上方。

这是我编写的代码,需要一段时间才能完成并给出错误的结果:

rooms([west,center,east]).
floors([bottom,middle,top]). 

students([alex,bret,chris,derek,eddie,fred,greg,harold,john]).

student(S) :-
        students(L), member(S,L).

empty_building(building(floor(_,_,_),floor(_,_,_),floor(_,_,_))).

location(P,1,1,building(floor(P,_,_),_,_)).
location(P,1,2,building(floor(_,P,_),_,_)).
location(P,1,3,building(floor(_,_,P),_,_)).
location(P,2,1,building(_,floor(P,_,_),_)).
location(P,2,2,building(_,floor(_,P,_),_)).
location(P,2,3,building(_,floor(_,_,P),_)).
location(P,3,1,building(_,_,floor(P,_,_))).
location(P,3,2,building(_,_,floor(_,P,_))).
location(P,3,3,building(_,_,floor(_,_,P))).

puzzle_soln(BLDG) :-
    empty_building(BLDG), 
    location(harold,HFN,_,BLDG), 
    location(fred,FFN,FRN,BLDG), 
    location(john,JFN,JRN,BLDG),
    location(bret,BFN,BRN,BLDG),
    location(eddie,EFN,ERN,BLDG),
    location(derek,DFN,DRN,BLDG),
    location(greg,GFN,GRN,BLDG),
    location(chris,CFN,CRN,BLDG),
    location(alex,_,_,BLDG),        

    HFN \= 1,                           
    FFN is JFN + 1,                     
    FRN = JRN,
    1 =:= abs(FRN - BRN),               
    FFN = BFN,
    BRN is 1,                           
    ERN is 3,                           
    EFN is FFN + 1,                     
    DFN is FFN + 1,                      
    DRN = FRN,
    GFN is CFN + 1,                     
    GRN = CRN. 

这里是有问题和解决方案的网站的链接:https://www.brainbashers.com/showpuzzles.asp?puzzle=ZQJZ

任何帮助将不胜感激。

【问题讨论】:

    标签: prolog zebra-puzzle


    【解决方案1】:

    你得到了正确的答案。

    ?- puzzle_soln(X).
    X = building(floor(alex, john, chris), floor(bret, fred, greg), floor(harold, derek, eddie))
    

    与此相同(从底部数楼层)

    West    Centre  East
    ====    ======  ====
    Harold  Derek   Eddie
    Bret    Fred    Greg
    Alex    John    Chris
    

    如果你想加快速度,你可以交错生成和测试:

    puzzle_soln(BLDG) :-
      empty_building(BLDG),
      BRN is 1,
      ERN is 3,
      location(harold,HFN,_,BLDG),
      HFN \= 1,
      location(fred,FFN,FRN,BLDG),
      location(john,JFN,JRN,BLDG),
      FFN is JFN + 1,
      EFN is FFN + 1,
      DFN is FFN + 1,
      FRN = JRN,
      location(bret,BFN,BRN,BLDG),
      1 =:= abs(FRN - BRN),
      FFN = BFN,
      location(eddie,EFN,ERN,BLDG),
      location(derek,DFN,DRN,BLDG),
      DRN = FRN,
      location(greg,GFN,GRN,BLDG),
      location(chris,CFN,CRN,BLDG),
      GFN is CFN + 1,
      GRN = CRN,
      location(alex,_,_,BLDG).
    

    旧版本:869,727 次推理,0.533 CPU 在 0.533 秒内

    新版本:310 次推理,0.000 秒 CPU 0.000

    CLP(FD) 解决方案:61,356 次推理,0.011 秒内 0.011 个 CPU

    【讨论】:

    • 如果您使用#= 而不是is=:= 等,对这个新版本进行基准测试会很有趣。
    【解决方案2】:

    CLP(FD) 对这个难题很有用:

    :- use_module(library(clpfd)).
    %
    %   7 8 9
    %   4 5 6
    %   1 2 3
    solve(L) :-
        L = [A, B, C, D, E, F ,G, H, J],
        L ins 1..9,
        all_distinct(L),
        % 1. Harold does not live on the bottom floor.
        H #> 3,
        % 2. Fred lives directly above John and directly next to Bret
        % (who lives in the West wing).
        F #= J + 3,
        B #= F - 1,
        B in 1 \/ 4 \/ 7,
        % 3. Eddie lives in the East wing and one floor higher than Fred.
        E #> F,
        E in 3 \/ 6 \/ 9,
        (   (   F in 1..3 #<==> E in 4..6) #\/ (  F in 4..6 #<==> E in 7..9)),
        % answer edited after Mat's remark
        % (   (   F in 1..3 #<==> E in 4..6) ; (  F in 4..6 #<==> E in 7..9)),
        % 4. Derek lives directly above Fred.
        D #= F + 3,
        % 5. Greg lives directly above Chris.
        G #= C + 3,
        label(L).
    

    这给出了解决方案(不幸的是 2 次!)

    编辑现在,只有一个解决方案!

    ?- solve( [A, B, C, D, E, F ,G, H, J]).
    A = 1,
    B = 4,
    C = 3,
    D = 8,
    E = 9,
    F = 5,
    G = 6,
    H = 7,
    J = 2.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多