2017-01-18 8 views
0

У меня есть вопрос относительно моей задачи. Задача:Prolog Free Days Code

У людей есть назначенные им дни. В эти дни они свободны для работы.

Карл свободно на Mo, ср, чт

Лукас свободно на Вт, Ср, Чт, Пт

Джон свободно на Mo, Ср, Sa

Alex свободен на Thu, Fr, Sa

Max is бесплатно на Мо, Ср, Пт, Сб, Вс

Я создал базу знаний для этих предположений:

free(Karl,Mo). 

free(Karl,Wed). 

free(Karl,Thu). 

.. 

.. 

free(Max,Su). 

4 Задаются вопросы:

  1. бесплатно на день Y Является ли лицо Х .

  2. Когда есть свободные люди.

  3. Какие лица свободны 2/3/4 дня в строке.

  4. Кто бесплатно 3 дня подряд.

Вопросы 1 просты.

?- free(X,Day). 

Cant выяснить последние 3.

Спасибо за вашу помощь.

+1

На 2-4 вы должны написать код: предикаты, описывающие логику соответствуют критериям. Что вы пробовали? Кроме того, у вас будет проблема с тем, как вы сейчас показываете свои факты. В Prolog переменные начинаются с заглавной буквы или '_', а атомы начинаются с нижнего регистра. 'free (Karl, Mo)' имеет две переменные. Вы должны либо заключить их в одинарные кавычки ('free ('Karl', 'Mo')'), либо использовать строчные буквы 'free (karl, mo)') или использовать микс ('free ('Karl', mo) '). – lurker

+0

Я бы также рекомендовал изменить стиль дня от wordy-атомов до целых чисел, так что вам не нужно определять, что tue следует за mo, например. –

ответ

0

свободный (susi, 1).

свободный (susi, 3).

свободный (susi, 4).

свободный (horst, 2).

свободный (horst, 3).

свободный (horst, 4).

свободный (horst, 5).

свободный (lars, 1).

свободный (lars, 3).

свободный (lars, 6).

свободный (hanna, 4).

свободный (hanna, 5).

свободный (hanna, 6).

свободный (фридолин, 1).

свободный (фридолин, 3).

свободный (фридолин, 5).

свободный (фридолин, 6).

свободный (фридолин, 7).

% свободный (X, Y).

% вместе (X, Y, Z).

вместе (Person1, Person2, When): - free (Person1, When), free (Person2, When), + (Person1 = Person2).

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

Застрял на третьем Сейчас:/

+0

Для третьей и четвертой задач лучше всего создать предикат, который ведет себя следующим образом: free_for_days (Person, Count), который находит день, когда человек свободен, а затем вызывает free_from_day_for_days (Person, Day, Count), который идентифицирует, свободны ли они на следующий день, затем возвращается к free_from_day_for_days (Person, Day + 1, Count - 1) –

+0

Принимая во внимание, что вам нужно будет использовать NewCount Count - 1, поскольку вы не можете сделать это на месте арифметика в прологе. Параметр «-» будет сопоставляться с образцом, если вы используете подпись, указанную в псевдокоде –

+0

. Вы также можете использовать 0 вместо 7 в своем дневном счете, чтобы вы могли использовать modulo при расчете на следующий день –