2013-04-02 235 views
0

我正在使用SWI Prolog for windows 7,我的任務之一是一個基本的邏輯難題。我們已經給出了一個解決單個問題的示例解決方案 - 包括其源代碼。swi prolog solve

其「它是一個領帶」的問題。但是,我不知道如何使用Solve:predicate獲得結果。在諮詢完.pl文件之後,我是否必須向控制檯或類似的東西輸入一個特定的命令?

感謝您的任何幫助。

源代碼(我沒有寫這個代碼):

% Problem #1, "It's a tie", Dell Logic Puzzles, October 1999 
% Each man (mr so-and-so) got a tie from a relative. 
tie(cupids). 
tie(happy_faces). 
tie(leprechauns). 
tie(reindeer). 

mr(crow). 
mr(evans). 
mr(hurley). 
mr(speigler). 

relative(daughter). 
relative(father_in_law). 
relative(sister). 
relative(uncle). 

solve :- 
tie(CrowTie), tie(EvansTie), tie(HurleyTie), tie(SpeiglerTie), 
all_different([CrowTie, EvansTie, HurleyTie, SpeiglerTie]), 

relative(CrowRelative), relative(EvansRelative), 
relative(HurleyRelative), relative(SpeiglerRelative), 
all_different([CrowRelative, EvansRelative, HurleyRelative, SpeiglerRelative]), 

Triples = [ [crow, CrowTie, CrowRelative], 
      [evans, EvansTie, EvansRelative], 
      [hurley, HurleyTie, HurleyRelative], 
      [speigler, SpeiglerTie, SpeiglerRelative] ], 

% 1. The tie with the grinning leprechauns wasn't a present from a daughter. 
\+ member([_, leprechauns, daughter], Triples), 

% 2. Mr. Crow's tie features neither the dancing reindeer nor the yellow happy faces. 
\+ member([crow, reindeer, _], Triples), 
\+ member([crow, happy_faces, _], Triples), 

% 3. Mr. Speigler's tie wasn't a present from his uncle. 
\+ member([speigler, _, uncle], Triples), 

% 4. The tie with the yellow happy faces wasn't a gift from a sister. 
\+ member([_, happy_faces, sister], Triples), 

% 5. Mr Evans and Mr. Speigler own the tie with the grinning leprechauns 
% and the tie that was a present from a father-in-law, in some order. 
((member([evans, leprechauns, _], Triples), 
    member([speigler, _, father_in_law], Triples)) ; 

    (member([speigler, leprechauns, _], Triples), 
    member([evans, _, father_in_law], Triples))), 

% 6. Mr. Hurley received his flamboyant tie from his sister. 
member([hurley, _, sister], Triples), 

tell(crow, CrowTie, CrowRelative), 
tell(evans, EvansTie, EvansRelative), 
tell(hurley, HurleyTie, HurleyRelative), 
tell(speigler, SpeiglerTie, SpeiglerRelative). 

% Succeeds if all elements of the argument list are bound and different. 
% Fails if any elements are unbound or equal to some other element. 
all_different([H | T]) :- member(H, T), !, fail. 
all_different([_ | T]) :- all_different(T). 
all_different([_]). 

tell(X, Y, Z) :- 
write('Mr. '), write(X), write(' got the '), write(Y), 
write(' tie from his '), write(Z), write('.'), nl. 

回答

0

諮詢文件後,只需鍵入謂詞的名稱,並在括號中的參數(如果有的話),然後是期。如果查詢中有多個謂詞,請用逗號分隔它們。在你的情況下(我叫文件solve.pl):

?- [solve]. 
% solve compiled 0.00 sec, 18 clauses 
true. 

?- solve. 
Mr. crow got the cupids tie from his daughter. 
Mr. evans got the leprechauns tie from his uncle. 
Mr. hurley got the reindeer tie from his sister. 
Mr. speigler got the happy_faces tie from his father_in_law. 
true ; 
false. 

?-