[英]Prolog Logic Puzzle not working?
我一直在研究這個Prolog邏輯問題。 它得到了不正確的結果,並且需要一段時間來運行程序本身,這是我更關心的問題。 邏輯問題如下:
亞歷克斯,布雷特,克里斯,德里克,埃迪,弗雷德,格雷格,哈羅德和約翰是九個學生,住在一棟三層樓的建築里,每層有三個房間。 西翼的一個房間,一個在中心,一個在東翼。 如果你直視建築物,左邊是西邊,右邊是東邊。 每個學生只分配一個房間。 你能找到他們每個房間的位置:
這是我編寫的代碼,需要一段時間才能完成並給出不正確的結果:
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
任何幫助,將不勝感激。
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秒內0.533 CPU
新版本:310推斷,0.000 CPU,0.000秒
CLP(FD)解決方案:61,356次推斷,0.011秒內0.011 CPU
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.