• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Логическая Задача

  • Автор темы Guest
  • Дата начала
G

Guest

Помогите пожалуйста. Используя отсечение, неуспех и отрицание, написать программу на Prolog:

На заводе работали три друга: слесарь, токарь и сварщик. Их фамилии Борисов, Иванов и Семенов. У слесаря нет ни братьев, ни сестер. Он самый младший из друзей. Семенов, женатый на сестре Борисова, старше токаря. Назвать фамилии слесаря, токаря и сварщика.

Решение есть: Семенов - сварщик, Борисов - токарь, Иванов - слесарь. Но на Prolog не получается никак, помогите, кто может.
 
R

rrrFer

попытки решить самостоятельно были? - если нет - помогу только за материальное вознаграждение.
 
G

Guest

Попытки были, вот то что получилось:

Код на Prolog

domains
imya=string
imeet_sestru=string
starshe_tokarya=string

class predicates // в этой строчке выдает 302 ошибку: Name of class expected.
professii (string, string, string)

nondeterm (o,o,o)

clauses
imya("Borisov").
imya("Ivanov").
imya("Semenov").

imeet_sestru("Borisov").

starshe_tokarya("Semenov").

professii(Slesar, Tokar, Svarshik):-
imya(Slesar),
imya(Tokar), Tokar <> Slesar,
imya(Svarshik), Svarshik <> Tokar, Svarshik <> Slesar,
not(imeet_sestru(Slesar)),
not(starshe_tokarya(Slesar)),
not(starshe_tokarya(Tokar)).

run():-
professii(Slesar, Tokar, Svarshik),
writef("% - slesar, % - tokar, % - svarshik\n",
Slesar, Tokar, Svarshik),
fail;
_ = readLine().


Из-за чего эта ошибка?
 
R

rrrFer

какой диалект пролога используете?

Добавлено: судя по "class predicates" и "nondeterm (o,o,o)" - visual prolog, скорее всего 5 версии.
Но если это visual prolog -То должен быть раздел goal, которого нет.

Добавлено:
Код:
domains
imya=string
в разделе domains объявляют типы данных, в результате объявления, приведенного выше imya стало синонимом string.
А чтобы писать вот так:
Код:
imya("Borisov").
надо было объявить imya в разделе database или facts( если на Visual) или в разделе predicetes( если на Turbo).
объявить примерно так:
Код:
imya(string)
 
R

rrrFer

Код:
predicates
professii (string, string, string)
imya( string )
imeet_sestru( string )
starshe_tokarya( string )

clauses
imya("Borisov").
imya("Ivanov").
imya("Semenov").

imeet_sestru("Borisov").

starshe_tokarya("Semenov").

professii(Slesar, Tokar, Svarshik):-
imya(Slesar),
imya(Tokar), Tokar <> Slesar,
imya(Svarshik), Svarshik <> Tokar, Svarshik <> Slesar,
not(imeet_sestru(Slesar)),
not(starshe_tokarya(Slesar)),
not(starshe_tokarya(Tokar)).
goal
professii(Slesar, Tokar, Svarshik),
write(Slesar," - slesar\n", Tokar, " - tokar\n", Svarshik, " - svarshik\n" ),readInt(_);
write("error"),nl,readInt(_)

поправил, хотя...мне чето не нравится решение )
 
G

Guest

Да, я использую Visual Prolog 5 версии. Не думал что из за этого может быть ошибка.

r04, спасибо большое за помощь.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!