Задача про гномов на рудниках Грендальфа

      Комментарии к записи Задача про гномов на рудниках Грендальфа отключены

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

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

    questioner
    Участник

    Добрый день. Помогите пожалуйста решить головоломку.

    Дана задача:

    На рудниках злого волшебника Грендальфа уже много лет трудятся пять гномов. По приказу чародея каждый из них ищет камни строго определённого вида. Грендальф хранит в своей канцелярии два списка узников: список имён, в котором имена гномов расположены по алфавиту, и список сроков, упорядоченный по возрастанию сроков заключения, среди которых есть 80,159,176 и 202 года.

    Известно, что:

    • Гном с кайлом стоит в списке сроков сразу после искателя сапфиров.
    • Брыкли в списке сроков следует сразу за гномом с турбобуром. Однако Брыкли
      придётся работать всё же не так долго, как специалисту по изумрудам.
    • Искателю изумрудов придётся томиться в подземелье дольше, чем Фигли, но и тот
      трудится уже больше 80 лет.
    • Звякли никогда не имел дела с сапфирами. В списке сроков он стоит прямо перед
      искателем агатов.
    • Квакли в списке сроков следует сразу за гномом с киркой и прямо перед гномом с
      отбойным молотком, ищущим алмазы.
    • Имя гнома, специализирующегося на алмазах, стоит в списке имён сразу после
      имени бедняги, который заключён на 131 год.

     

    Нужно ответить на вопросы:

    • Кто ищет рубины?
    • Кто работает заступом?
    • Каков срок заточения у Дрихли?

    На данный момент есть такой код:

    domains
    tname=string
    ttool=string
    tsrok=integer
    tston=string
    tsroki=tsroki(tname, tsrok, tston, ttool)
    tsrokilist=tsroki*
    predicates
    puzzle
    structure(tsrokilist)
    key(tsrokilist)
    question(tsrokilist, tname, tsrok)
    solution(tname, tsrok)
    tgname(tsroki,tname)
    tgtool(tsroki,ttool)
    tgston(tsroki,tston)
    tgsrok(tsroki,tsrok)
    stateafter(tsroki, tsroki, tsrokilist)
    member(tsroki,tsrokilist)
    goal
    puzzle.
    clauses
    puzzle:-
    structure(Struct),
    key(Struct),
    question(Struct, Name, Srok),
    solution(Name, Srok).
    structure([
    tsroki(_,80,_,_),
    tsroki(_,131,_,_),
    tsroki(_,159,_,_),
    tsroki(_,176,_,_),
    tsroki(_,202,_,_)
    ]).
    %structure(
    %[tsroki(_,_,_,_),
    %tsroki(_,_,_,_),
    %tsroki(_,_,_,_),
    %tsroki(_,_,_,_),
    %tsroki(_,_,_,_)]
    %).
    key(Sroki):-
    % объявление камней:
    %member(tsroki(_,80,_,_),Sroki),
    %member(tsroki(_,131,_,_),Sroki),
    %member(tsroki(_,159,_,_),Sroki),
    %member(tsroki(_,176,_,_),Sroki),
    %member(tsroki(_,202,_,_),Sroki),
    % объявление камней:
    %member(tsroki(_,_,"Almaz",_),Sroki),
    %member(tsroki(_,_,"Rubin",_),Sroki),
    %member(tsroki(_,_,"Sapfir",_),Sroki),
    %member(tsroki(_,_,"Agat",_),Sroki),
    %member(tsroki(_,_,"Izumrud",_),Sroki),
    % объявление инструментов:
    %member(tsroki(_,_,_,"Kailo"),Sroki),           
    %member(tsroki(_,_,_,"Turbobur"),Sroki),
    %member(tsroki(_,_,_,"Kirka"),Sroki),
    %member(tsroki(_,_,_,"Molot"),Sroki),
    %member(tsroki(_,_,_,"Zastup"),Sroki),
    %     ключ 1:
    %  Гном с кайлом стоит в списке сроков сразу после искателя сапфиров.
    stateafter(Gn2, Gn1, Sroki),
    tgtool(Gn1,"Kailo"),
    tgston(Gn2,"Sapfir"),
    %     ключ 2:
    %  Брыкли в списке сроков следует сразу за гномом с турбобуром. Однако Брыкли     
    %   придётся работать всё же не так долго, как специалисту по изумрудам.
    stateafter(Gn4, Gn3, Sroki),
    stateafter(Gn3, Gn5, Sroki),
    tgname(Gn3,"Brikli"),
    tgtool(Gn4,"Turbobur"),
    tgston(Gn5,"Izumrud"),
    %     ключ 3:
    %  Искателю изумрудов придётся томиться в подземелье дольше, чем Фигли, но и тот 
    %   трудится уже больше 80 лет.
    stateafter(Gn7, Gn6, Sroki),
    stateafter(Gn8, Gn7, Sroki),
    tgston(Gn6,"Izumrud"),
    tgname(Gn7,"Figli"),
    tgsrok(Gn8,80),
    %     ключ 4:
    %  Звякли никогда не имел дела с сапфирами. В списке сроков он стоит прямо перед
    %   искателем агатов.
    stateafter(Gn9, Gn10, Sroki),
    tgname(Gn9,"Zvakli"),
    not(tgston(Gn9,"Sapfir")),
    tgston(Gn10,"Agat"),
    %     ключ 5:
    %  Квакли в списке сроков следует сразу за гномом с киркой и прямо перед гномом с
    %   отбойным молотком, ищущим алмазы.
    stateafter(Gn12, Gn11, Sroki),
    stateafter(Gn11, Gn13, Sroki),
    tgname(Gn11,"Kvakli"),
    tgtool(Gn12,"Kirka"),
    tgtool(Gn13,"Molot"),
    tgston(Gn13,"Almaz"),
    %   ключ 6:
    %  Имя гнома, специализирующегося на алмазах, стоит в списке имён сразу после
    %   имени бедняги, который заключён на 131 год.
    stateafter(Gn15, Gn14, Sroki),
    tgston(Gn14,"Almaz"),
    tgsrok(Gn15,131).
    question(Sroki, Name, Srok):-
    %Вопрос 1 
    member(G1,Sroki),
    tgname(G1,Name),
    tgston(G1,"Rubin"),
    %Вопрос 2
    member(G2,Sroki),
    tgname(G2,Name),
    tgtool(G2,"Zastup"),
    %Вопрос 3
    member(G3,Sroki),
    tgsrok(G3,Srok),
    tgname(G3,"Drihli").
    solution(Name, Srok):-
    write("Rubin ishet Gnom"), write(Name), nl,
    write("Zastupom rabotaet Gnom"), write(Name), nl,
    write("Srok y Drihli"), write(Srok).
    stateafter(A,B,[A,B,C]).
    stateafter(A,C,[A,B,C]).
    stateafter(B,C,[A,B,C]). 
    tgname(tsroki(A,B,C,D),A).  %Имя
    tgsrok(tsroki(A,B,C,D),B).  %Срок
    tgston(tsroki(A,B,C,D),C).  %Камни
    tgtool(tsroki(A,B,C,D),D).  %Инструменты
    member(X,[X|Y]).
    member(X,[_|Y]):-
    member(X,Y).

    При запуске на трурбо прологе выдает 2 предупреждения:

    The variable is only used once

    Здесь:
    stateafter(A,B,[A,B,C]).

    The variable is not bound in this clause

    Здесь:

    structure(
    [tsroki(_,_,_,_),
    tsroki(_,_,_,_),
    tsroki(_,_,_,_),
    tsroki(_,_,_,_),
    tsroki(_,_,_,_)]
    ).

    В диалоговое окно ничего не выводит.

  • #1847

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

    The variable is only used once

    Интерпретатор предупреждает о том, что переменной дано имя, но она не используется. Устраняется такое предупреждение введением анонимной переменной (символ подчеркивания).

    stateafter(A,B,[A,B,C]).

    Переменная C не используется, поэтому интерпретатор оповещает вас на случай если вы планировали что-то написать, но забыли. Во всех остальных фрагментах примерно тоже самое.
    Исправляется так:
    stateafter(A,B,[A,B,_C]).

    Тут переменная _C является анонимной, предупреждение выдаваться не должно.

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

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