2015-12-18 1 views
0

Я знаю, что это не должно быть так сложно, но я не могу кода и решить эту конкретную логическую головоломку с прологомРешения логической головоломки с прологом

Трое друзей с разными национальностями получили первые три места как сверху спортсмены. Майкл предпочитает баскетбол и играет лучше своего друга . Симон из Англии играет лучше всего в теннис. Игрок в крикет занял первое место. Кто такой австралиец? Какое место сделал Sigurd get?

Может кто-нибудь помочь мне или дать мне подсказку с чего начать? Спасибо.

+3

Пожалуйста, попробуйте что-нибудь, прежде чем оставлять вопрос. Начните с перевода на синтаксис Prolog фактов, данных вам в описании проблемы. Затем напишите запрос на эти факты. – dasblinkenlight

ответ

0

Я чувствую, что в заявлении проблемы есть противоречие, или я использую то, что я не должен использовать или неправильно понимать проблему.

  1. Michael играет в баскетбол.
  2. Размещение Михаила было выше американских.
  3. Саймон из Англии.
  4. Simon играет в теннис.
  5. Игрок в крикету занял первое место.

Я считаю, что игрок в крикет должен быть Сигурдом, потому что ни Майкл, ни Саймон не играют в крикет. Это означает, что Сигурд занял первое место. Майкл не может попасть на третье место, потому что его размещение выше чужого, но оно также не может быть первым местом, потому что это принадлежит Сигурду, поэтому он должен быть на втором месте. Но это будет означать, что Саймон занял третье место и что Саймон - американец, но из наших предположений мы знаем, что Саймон из Англии.

Что я не понимаю о проблеме?

Чтобы ответить на этот вопрос, выполните следующие действия, которые я последую при решении такой проблемы.

  1. Составьте список, как я сделал выше, только основные факты, развешенные из их предложений в заявлении проблемы.
  2. Преобразовать этот список фактов Пролога:

    player(michael). 
    player(simon). 
    player(sigurd). 
    
    nation(england). 
    nation(america). 
    nation(australia). 
    
    game(basketball). 
    game(tennis). 
    game(cricket). 
    
    origin(simon, england). 
    
    plays(michael, basketball). 
    
  3. Сделать правила для кодирования более сложные отношения, выраженные в этой проблеме. Например:

    place(X, 1) :- player(X), plays(X, cricket). 
    

Отсюда я не могу много, потому что я знаю, что не будет решением, как я понимаю проблему, но я надеюсь, что по крайней мере указывает путь.

1

Вот одна формулировка, предназначенная для решения вашей проблемы. Он немного подробный и не особенно эффективный, но он должен быть достаточно ясным.

all_diff(L) :- \+ (select(X,L,R), memberchk(X,R)). 

countries([england,usa,australia]). 
country(X) :- 
    countries(C), member(X, C).   

placings([1,2,3]).  
placing(X) :-  
    placings(C), member(X, C). 

sports([tennis,cricket,basketball]).  
sport(X) :-  
    sports(C), member(X, C). 

names([michael, simon, sigurd]).  
name(X) :-  
    names(C), member(X, C). 


solution(Solution) :-  
    Solution = [E1, E2, E3],  
    E1 = [michael, C1, S1, P1],  
    E2 = [simon, C2, S2, P2],  
    E3 = [sigurd, C3, S3, P3],  
    country(C1),  
    country(C2),  
    country(C3),  
    all_diff([C1,C2,C3]),   
    sport(S1),  
    sport(S2),  
    sport(S3),  
    all_diff([S1,S2,S3]),  
    placing(P1),  
    placing(P2),  
    placing(P3),  
    all_diff([P1,P2,P3]), 

    member([michael,CMichael,basketball,PMichael], Solution),  
    CMichael \= usa, 

    member([_,usa,_,PAmerican], Solution),  
    PMichael < PAmerican, 

    member([simon,england,tennis,_], Solution), 

    member([_,_,cricket,1], Solution). 

Однако, как сказал Дэниел Лайонс, нет на самом деле нет решения этого набора ограничений:

?- solution(S). 
false. 

Если вы стучите окончательное ограничение (то есть один про игрок в крикет с первой место), вы можете увидеть, что будет решения:

?- solution(S). 
S = [[michael, australia, basketball, 1], [simon, england, tennis, 2], [sigurd, usa, cricket, 3]] ; 
S = [[michael, australia, basketball, 1], [simon, england, tennis, 3], [sigurd, usa, cricket, 2]] ; 
S = [[michael, australia, basketball, 2], [simon, england, tennis, 1], [sigurd, usa, cricket, 3]] ; 
false. 

Если рецептура ЗАГАДКИ были изменены, чтобы этот последний факт:

«Игрок по крикету занял второе место».

... вы бы иметь уникальное решение:

?- solution(S). 
S = [[michael, australia, basketball, 1], [simon, england, tennis, 3], [sigurd, usa, cricket, 2]] ; 

Как и в сторону: это вполне приемлемо (и иногда предпочтительнее) использовать подход Daniel Львиный для определения, например, набор видов спорта как совокупность отдельных фактов (возможно, более элегантный в этом случае). Тем не менее, мой опыт работы с нетривиальными программами PL обучил меня тому, что обычно удобнее указывать коллекцию в виде списка, с дополнительным предикатом для перечисления отдельных членов этого списка. Это упрощает работу с этими членами по отдельности или в виде полной коллекции.

+0

Я хотел бы узнать больше о ваших нетривиальных программах PL. Я предполагаю, что вы имеете в виду Пролог. –

+0

Я работаю коммерческим программистом в кодовых базах Пролога среднего и крупного масштаба. (Не многие из нас ...) – Kaitain

+0

Если кто-нибудь из них с открытым исходным кодом (ха-ха), я бы с удовольствием посмотрел код. Я не ищу работу сейчас, но напишу мне письмо в следующий раз, когда вы нанимаете. Я хотел бы иметь возможность профессионально улучшить Prolog. –

Смежные вопросы