Логическая задача: автомобильные гонки

      Комментарии к записи Логическая задача: автомобильные гонки отключены

В этой теме 2 ответа, 2 участника, последнее обновление  Васильев Владимир Сергеевич 9 мес., 3 нед. назад.

  • Автор
    Сообщения
  • #2659

    Shelovskikh
    Участник

    Помогите пожалуйста решить задачу:

    В автомобильных гонках три первых места заняли Алеша, Петя и Коля. Какое место занял каждый из них, если Петя занял не второе и не третье место, а Коля – не третье?

    Написала такой код, говорит – yes и ничего не выводит.

    name(alesha).
    name(petya).
    name(kolya).
    mesto(pervoe).
    mesto(vtoroe).
    mesto(tretie).
    soot(X, Y) :- name(X),  X=petya, 
             mesto(Y), not(Y=vtoroe), not(Y=tretie).
    soot(X, Y) :- name(X), X=kolya,
             mesto(Y), not(Y=tretie).
    soot(X, Y) :- name(X),  X=alesha, mesto(Y).
    reshenie(X1,Y1,X2,Y2,X3,Y3) :-
             X1=petya, soot(X1,Y1),
             X2=kolya, soot(X2,Y2),
             X3=alesha, soot(X3,Y3),
             Y1\=Y2, Y2\=Y3, Y1\=Y3.
    ?- reshenie(X1,Y1,X2,Y2,X3,Y3),write(X1,Y1,X2,Y2,X3,Y3).

  • #2661

    У вас очень сложное решение. Вы сначала описываете все возможные места и имена участников. Но ведь затем, вы все равно пишите:

    name(X),  X=petya,
    % ... 
    name(X), X=kolya,
    % ...
    name(X),  X=alesha, 

    Т.е. я не вижу особого смысла описывать имена предикатом name.

  • #2668

    Вообще, вам нужно:

    • выбрать 3 позиции (например, функцией member);
    • проверить чтобы они не повторялись (можно использовать функцию unique, но в моем коде это сделано при помощи трех сравнений);
    • добавить три ограничения, заданных в программе.

    solution(KolyaPosition, AleshaPosition, PetyaPosition):- 
      Positions = [1, 2, 3],
      
      member(KolyaPosition, Positions),
      member(AleshaPosition, Positions),
      member(PetyaPosition, Positions),
      
      KolyaPosition \= AleshaPosition, KolyaPosition \= PetyaPosition,
      AleshaPosition \= PetyaPosition,
      
      PetyaPosition \= 2, PetyaPosition \= 3,
      KolyaPosition \= 3.

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

    Вложения:

Для ответа в этой теме необходимо авторизоваться.