Решение головоломки на Прологе

Я новичок в прологе и пытаюсь решить эту проблему. Я сделал пару руководств по основам пролога на YouTube, но мне нужна помощь в решении головоломки ниже.

Две недели назад четыре энтузиаста наблюдали объекты в небе по соседству. Каждый из четверых сообщил о своих наблюдениях в разные дни. Приехало ФБР и могло дать каждому человеку собственное объяснение того, что он или она «на самом деле» видел. Можете ли вы определить день (со вторника по пятницу), когда каждый человек увидел объект, а также объект, которым он оказался?

  1. Мистер К. заметил на этой неделе раньше, чем тот, кто видел воздушный шар, но в какой-то момент позже, чем тот, кто заметил воздушного змея (а не г-жа Дж.).
  2. Пятницу заметила либо мисс Барн, либо тот, кто видел самолет (или и то, и другое).
  3. Г-н Ник не заметил во вторник.
  4. Мистер К. не тот, чьим объектом оказался телефонный столб.

Я правильно установил свои правила, но, похоже, я не могу понять логику. Я ищу руководство, а не прямые ответы. Справа я указал номер каждого вопроса, на который пытаюсь ответить.

        enthu(mr_k).
        enthu(ms_barn).
        enthu(ms_g).
        enthu(mr_nik).

        object(ballon).
        object(kite).
        object(plane).
        object(tele_pole).

        day(tuesday).
        day(wednesday).
        day(thursday).
        day(friday).



        sight(X,ballon).

        sighting(mr_k):-   1
        day(X),
        sight(X,Y),
        didntc_kite(ms_g).

        friday_sight:- enthu(ms_barn);    2
        saw(X,plane);
        both(ms_barn,X).


        nosight_tuesday(mr_nik,X).          3

        no_telepole(mr_k,Y).          4

person Micheal C.    schedule 14.11.2016    source источник
comment
Есть ли причина для этого mr_klien, а не mr_k, которое вы объявили в первый раз?   -  person Searching    schedule 15.11.2016
comment
Ага, вот что я получаю за некорректное копирование и вставку. Он был обновлен.   -  person Micheal C.    schedule 15.11.2016
comment
Что такое логический даун-пак?   -  person Enigmativity    schedule 15.11.2016
comment
О, ты имеешь в виду похлопать?   -  person Enigmativity    schedule 15.11.2016
comment
Указатель 1: посмотрите, сможете ли вы переписать свои правила с sighting в качестве интересующего действия / объекта ... например, вместо того, чтобы говорить nosight_tuesday(mr_nik,X).. построить правило, делающее прицеливание true ike sighting(mr_nik) :- ... sighting(mr_k) :- ... и т. д.   -  person Searching    schedule 15.11.2016
comment
См., Например, здесь. В меню «Примеры» вверху есть еще много небольших программ, которые помогут вам начать работу.   -  person    schedule 15.11.2016
comment
Возможный дубликат Загадки Эйнштейна со списком терминов   -  person Mostowski Collapse    schedule 21.12.2016


Ответы (1)


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

Вот что бы я сделал:

/*
1. Mr. K made his sighting at some point earlier in the week than the one who saw the balloon, but at some point later in the week, than the one who spotted the Kite ( who isn't Ms. G ).
2. Friday's sighting was made by either Ms. Barn or the one who saw a plane ( or both ).
3. Mr. Nik did not make his sighting on Tuesday.
4. Mr. K isn't the one whose object turned out to be a telephone pole.
*/

?-
% Set up a list of lists to be the final solution
        Days = [[tuesday,_,_],[wednesday,_,_],[thursday,_,_],[friday,_,_]],
/* 1 */ before([_,mr_k,_],[_,_,balloon],Days),
/* 1 */ before([_,_,kite],[_,mr_k,_],Days),
/* 2 */ (member([friday,ms_barn,_],Days);
            member([friday,_,plane],Days);
            member([friday,ms_barn,plane],Days)),
% Fill in the rest of the people
        members([[_,mr_k,_],[_,ms_barn,_],[_,ms_g,_],[_,mr_nik,_]],Days),
% Fill in the rest of the objects
        members([[_,_,balloon],[_,_,kite],[_,_,plane],[_,_,tele_pole]],Days),
% Negations should be done after the solution is populated
/* 1 */ member([_,NOT_ms_g,kite],Days), NOT_ms_g \= ms_g,
/* 3 */ member([tuesday,NOT_mr_nik,_],Days), NOT_mr_nik \= mr_nik,
/* 4 */ member([_,NOT_mr_k,tele_pole],Days), NOT_mr_k \= mr_k,
    write(Days),
    nl,
    fail.

% Checks that `X` comes before `Y`
% in the list `Ds`
before(X,Y,Ds) :-
    remainder(X,Ds,Rs),
    member(Y,Rs).

% Finds a member of a list and
% unifies the third parameter such
% that it is the remaining elements in
% the list after the found member
remainder(X,[X|Ds],Ds).
remainder(X,[_|Ds],Rs) :- remainder(X,Ds,Rs).

% An extended version of `member` that
% checks if the members of the first list
% are all members of the second
members([],_).
members([X|Xs],Ds) :-
    member(X,Ds),
    members(Xs,Ds).

Это дает мне:

[[tuesday, ms_g, tele_pole],
    [wednesday, mr_nik, kite],
    [thursday, mr_k, plane],
    [friday, ms_barn, balloon]]
person Enigmativity    schedule 15.11.2016
comment
Я очень ценю ваш ответ. Но это кажется очень сложным. Можете ли вы упростить это / объяснить мне, что на самом деле происходит. - person Micheal C.; 15.11.2016
comment
@MichealC. - Конечно, могу, но, может быть, через несколько часов. - person Enigmativity; 15.11.2016
comment
Хорошо, это не проблема. Но когда у вас появляется шанс, я вижу, что вы используете массивы, что сейчас не в моей лиге. Пожалуйста, простота. - person Micheal C.; 15.11.2016
comment
@MichealC. В этом ответе нет массивов. Это классический способ решения классического примера головоломок на Прологе. В Интернете и здесь, в stackoverflow, есть масса подобных головоломок и решений. - person ; 15.11.2016
comment
@MichealC. Вы просите о бесплатном личном наставничестве от Enigmativity. Это все хорошо, но я не знаю, является ли Stackoverflow форумом для этого. - person ; 15.11.2016
comment
@Boris - Нет проблем с тем, о чем просил OP. В любом случае я должен был дать какое-то объяснение вместе с этим ответом. - person Enigmativity; 15.11.2016
comment
Как я уже сказал, все в порядке, но что-то в этом отношении меня раздражало. Вопрос OP в любом случае является хрестоматийным примером неудачной попытки задать вопрос на форуме, подобном Stackoverflow. - person ; 15.11.2016
comment
какое отношение? Ты в порядке? Я не могу задавать вопросы? Еще раз спасибо @Enigmativity. - person Micheal C.; 15.11.2016
comment
@Enigmativity, так что вернемся к нашему разговору .... Я получаю сообщение об ошибке Точка в тексте предложения? Невозможно переопределить, / 2 Есть предложения? - person Micheal C.; 15.11.2016
comment
@MichealC. - Приведенный выше код дословно выполняется в Strawberry Prolog. Я мог бы предположить, что существуют различия в синтаксисе между системами пролога, но это не изменило бы ,/2. Можете ли вы проверить, правильно ли вы копируете и вставляете? - person Enigmativity; 16.11.2016
comment
Я правильно скопировал и вставил. Я использую swi-prolog. - person Micheal C.; 16.11.2016
comment
@MichealC. - Я отлично запустил его в SWI, как только переместил запрос ?- в конец источника. - person Enigmativity; 16.11.2016
comment
@MichealC. - Я запустил. - person Enigmativity; 16.11.2016
comment
@Enigmativity Большое спасибо, мой добрый сэр. Я очень ценю это. - person Micheal C.; 16.11.2016
comment
@Enigmativity, ты никогда толком не объяснял, как ты решил головоломку. Мы попали в обход. Не могли бы вы объяснить, что происходит? - person Micheal C.; 21.12.2016
comment
@MichealC. - Я добавил пояснение. - person Enigmativity; 21.12.2016