2013-04-02 179 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. 

?-