Prolog Logic Puzzle 不工作?

Prolog Logic Puzzle not working?

我已经研究这个 Prolog 逻辑问题一段时间了。它得到的结果不正确,运行 程序本身需要一段时间,这是我更关心的。逻辑问题如下:

Alex, Bret, Chris, Derek, Eddie, Fred, Greg, Harold, and John are nine students who live in a three story building, with three rooms on each floor. A room in the West wing, one in the centre, and one in the East wing. If you look directly at the building, the left side is West and the right side is East. Each student is assigned exactly one room. Can you find where each of their rooms is:

  1. 哈罗德不住在底层。
  2. Fred 住在 John 的正上方,紧邻 Bret(住在西翼)。
  3. 埃迪住在东翼,比弗雷德高一层。
  4. Derek 住在 Fred 的正上方。
  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. 

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

如有任何帮助,我们将不胜感激。

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.

您的答案是正确的。

?- 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 秒内 0.000 CPU

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