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

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

Guest

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

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

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

rrrFer

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

Guest

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

Код на 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

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

Добавлено: судя по "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

#5
Код:
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

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

r04, спасибо большое за помощь.