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

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

В этой теме 3 ответа, 2 участника, последнее обновление  Васильев Владимир Сергеевич 5 мес., 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.

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

    Вложения:
  • #3558

    Используя Пролог можно решать логические задачи достаточно просто. Многие логические задачи (включая вашу) связаны с рассмотрением нескольких конечных множеств с одинаковым количеством элементов, между которыми устанавливаются взаимно-однозначные соответствия. На языке Пролог эти множества описываются в виде фактов, а зависимости между объектами устанавливаются в виде правил.

    Традиционный способ решения таких задач сводится к заполнению таблицы знаками и +, или нанесению на оси координат темных и светлых кружков, которые соответствуют некоторым условиям, указанным в задаче. Рассмотрим решение задачи на примере, вначале традиционным способом, а затем с использованием языка Пролог.

    Как показано на рисунке поставим символ минус в клетки, которые соответствуют условиям:

    Геометрически задача соответствия означает, что на каждой горизонтали и вертикали может стоять только один +. Из этого вытекает два правила экстраполяции, позволяющие автоматически завершить решение задачи:

    1. Если на горизонтали (вертикали) все знаки кроме одного – то свободная позиция фиксируется значением +.
    2. Если на горизонтали (вертикали) имеется +, то все остальные значения
      заполняются знаком .

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

    На языке Пролог структура программы будет иметь вид:

    predicates
    имя(symbol) - nondeterm (o) nondeterm (i)
    место(symbol) - nondeterm (o)nondeterm (i)
    соответствие(symbol,symbol) - nondeterm (i,i) nondeterm (i,o)
    решение(symbol,symbol,symbol,symbol,symbol,symbol) - nondeterm nondeterm (o,o,o,o,o,o)
    clauses
    % база данных имен
    имя(ваня).
    имя(петя).
    имя(коля).
    % база данных мест
    место(первое).
    место(второе).
    место(третье).
    % определим однозначное соответствие И – имя, М - место
    соответствие(И,М):-
    имя(И), И=петя, место(М),
    not(М=второе), not(М=третье).
    соответствие(И,М):-
    имя(И), И=коля, место(М),
    not(М=третье).
    соответствие(И,М):-
    имя(И), И=ваня, место(М).
    решение(И1,М1,И2,М2,И3,М3):-
    И1=петя,соответствие(И1,М1),
    И2=коля,соответствие(И2,М2),
    И3=ваня,соответствие(И3,М3),
    М1<>М2,М1<>М3,М2<>М3.
    goal
    решение(Имя1,Место1,Имя2,Место2,Имя3,Место3).

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