Генеалогическое дерево на языке Пролог

Проблема в следующем: я вызываю правило 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"). :

  1. факт male("Pavel I Petrovich").

  2. вывод из

    male(Name):- not(female(Name)).

Оставьте что-то одно: или оба набора фактов male(X) и female(X), или набор фактов female(X) и правило вывода male(X)

→ Ссылка