Пролог - Не ожидаемый результат - PullRequest
1 голос
/ 12 марта 2020

У меня есть этот факт, который возвращает потомков, но он возвращает, только если "ascendente" является отцом / матерью "descendente". Что я делаю не так?

%descendenteDir(homem,mulher,filho)
descendenteDir('Tywin','Joanna','Ser Jaime').
descendenteDir('Tywin','Joanna','Cersei').
descendenteDir('Robert','Cersei','Joffrey').
descendenteDir('Robert','Cersei','Myrcella').
descendenteDir('Robert','Cersei','Tommen').
descendenteDir('Kevan','Dorna','Lancel').

descendente(Ascendente,Descendente):- descendenteDir(Ascendente,_,Descendente)
    ;descendenteDir(_,Ascendente,Descendente)
    ;descendenteDir(descendente(Ascendente,_),_,Descendente)
    ;   descendenteDir(_,descendente(Ascendente,_),Descendente).

1 Ответ

1 голос
/ 12 марта 2020

Часть descendente(Ascendente,_) в последнем правиле не совсем верна. Это должно быть примерно так:

descendente(Ascendente,Descendente):- descendenteDir(Ascendente,_,Descendente)
    ;descendenteDir(_,Ascendente,Descendente)
    ;descendenteDir(X,_,Descendente), descendente(Ascendente,X)
    ;descendenteDir(_,X,Descendente), descendente(Ascendente,X).

Это не то же самое, что вызов функций и получение возвращаемых значений в таких языках, как C ++ / Python / Java. В Прологе у вас есть набор фактов (правила descendenteDir вверху) и некоторые правила вывода (правило descendente). В определении, где вы будете использовать правило рекурсивно, вы должны будете указать переменную, которая будет привязана к доступным значениям (из фактов). Эта переменная позже будет использоваться для вывода последующих правил. Здесь X это та переменная. Пролог свяжет с ним разные значения и попытается вывести следующую часть из следующего предложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...