Генеалогическое дерево на языке Пролог
Проблема в следующем: я вызываю правило son, чтобы найти его родителей, но программа почему-то выдает каждого по два раза. Как это исправить?
predicates
nondeterm parent(symbol, symbol)
nondeterm female(symbol)
nondeterm male(symbol)
nondeterm son(symbol, symbol)
clauses
female("Maria Ilyinichna").
female("Natalia Kirillovna").
female("Evdokia Fedorovna").
female("Ekaterina I Alekseevna").
female("Sofya Alekseevna").
female("Anna Petrovna").
female("Elizaveta Petrovna").
female("Ekaterina Ioannovna").
female("Anna Ioannovna").
female("Ekaterina II Alekseevna").
female("Anna Leopoldovna").
male(Name):-
not(female(Name)).
male("Mikhail Fedorovich").
male("Alexey Mikhailovich").
male("Fedor Alekseevich").
male("Ioann V Alekseevich").
male("Petr I Alekseevich").
male("Alexey Petrovich").
male("Petr II Alekseevich").
male("Petr III Fedorovich").
male("Ioann VI Antonovich").
male("Pavel I Petrovich").
male("Alexander I Pavlovich").
male("Nikolay I Pavlovich").
male("Alexander II Nikolaevich").
male("Alexander III Aleksandrovich").
male("Nikolay II Aleksandrovich").
son(Son, Parent):-
parent(Parent, Son), male(Son).
parent("Mikhail Fedorovich", "Alexey Mikhailovich").
parent("Alexey Mikhailovich", "Fedor Alekseevich").
parent("Alexey Mikhailovich", "Sofya Alekseevna").
parent("Alexey Mikhailovich", "Ioann V Alekseevich").
parent("Alexey Mikhailovich", "Petr I Alekseevich").
parent("Maria Ilyinichna", "Fedor Alekseevich").
parent("Maria Ilyinichna", "Sofya Alekseevna").
parent("Maria Ilyinichna", "Ioann V Alekseevich").
parent("Natalia Kirillovna", "Petr I Alekseevich").
parent("Ioann V Alekseevich", "Ekaterina Ioannovna").
parent("Ioann V Alekseevich", "Anna Ioannovna").
parent("Ekaterina Ioannovna", "Anna Leopoldovna").
parent("Anna Leopoldovna", "Ioann VI Antonovich").
parent("Petr I Alekseevich", "Alexey Petrovich").
parent("Evdokia Fedorovna", "Alexey Petrovich").
parent("Petr I Alekseevich", "Anna Petrovna").
parent("Petr I Alekseevich", "Elizaveta Petrovna").
parent("Ekaterina I Alekseevna", "Anna Petrovna").
parent("Ekaterina I Alekseevna", "Elizaveta Petrovna").
parent("Alexey Petrovich", "Petr II Alekseevich").
parent("Anna Petrovna", "Petr III Fedorovich").
parent("Petr III Fedorovich", "Pavel I Petrovich").
parent("Ekaterina II Alekseevna", "Pavel I Petrovich").
parent("Pavel I Petrovich", "Alexander I Pavlovich").
parent("Pavel I Petrovich", "Nikolay I Pavlovich").
parent("Nikolay I Pavlovich", "Alexander II Nikolaevich").
parent("Alexander II Nikolaevich", "Alexander III Aleksandrovich").
parent("Alexander III Aleksandrovich", "Nikolay II Aleksandrovich").
goal
son("Pavel I Petrovich", X).
Ответы (1 шт):
Автор решения: Cost
→ Ссылка
У вас есть два пути получения ответа на вопрос male("Pavel I Petrovich"). :
факт
male("Pavel I Petrovich").вывод из
male(Name):- not(female(Name)).
Оставьте что-то одно: или оба набора фактов male(X) и female(X), или набор фактов female(X) и правило вывода male(X)