Prolog 如何为位于数据库不同部分的任意两个代表实现关系?

Prolog 如何为位于数据库不同部分的任意两个代表实现关系?,prolog,transitive-closure,Prolog,Transitive Closure,任务:创建一个数据库查询,为该属的任何两个代表提供层次关系,换句话说,找出谁是祖先,谁是后代。 数据库: 例如: 鲁瑞克-祖先,奥列格-后代。 如何实现这一点?到目前为止,您编写了哪些规则来尝试这一点?我在数据库中添加了几行,但这不是我需要的,因为当我请求:?-relations('Rurik','Oleg')时,它将打印:true,但我需要:?-relations('Rurik','Oleg')-->Rurik-祖先,Oleg-后代。看起来您需要一个祖先(祖先,祖先):-\u等和后代(后代,祖

任务:创建一个数据库查询,为该属的任何两个代表提供层次关系,换句话说,找出谁是祖先,谁是后代。
数据库:

例如:

鲁瑞克-祖先,奥列格-后代。

如何实现这一点?

到目前为止,您编写了哪些规则来尝试这一点?我在数据库中添加了几行,但这不是我需要的,因为当我请求:?-relations('Rurik','Oleg')时,它将打印:true,但我需要:?-relations('Rurik','Oleg')-->Rurik-祖先,Oleg-后代。看起来您需要一个
祖先(祖先,祖先):-\u等
后代(后代,祖先):-\u等
能够回答这些问题。可能是,但如何实现?
parent('Rurik', 'Igor').
parent('Igor', 'Olga').
parent('Olga', 'Svyatoslav Igorevich').
parent('Svyatoslav Igorevich', 'Yaropolk').
parent('Yaropolk', 'Svyatopolk Okoyanny').
parent('Svyatoslav Igorevich', 'Vladimir Svyatoy').
parent('Vladimir Svyatoy', 'Yaroslav I Mudry').
parent('Yaroslav I Mudry', 'Svyatoslav').
parent('Svyatoslav', 'Oleg').
parent('Oleg', 'Vsevolod II').
parent('Yaroslav I Mudry', 'Izyaslav I').
parent('Izyaslav I', 'Svyatopolk').
parent('Yaroslav I Mudry', 'Vsevolod I').
parent('Vsevolod I', 'Vladimir Monomah').
parent('Vladimir Monomah', 'Mstislav Veliky').
parent('Mstislav Veliky', 'Izyaslav II').
parent('Vladimir Monomah', 'Yaropolk II').
parent('Vladimir Monomah', 'Yuriy Dolgoruky').
parent('Yuriy Dolgoruky', 'Mikhail I').
parent('Yuriy Dolgoruky', 'Vsevolod Bolshoe Gnezdo').
parent('Vsevolod Bolshoe Gnezdo', 'Yuriy II').
parent('Vsevolod Bolshoe Gnezdo', 'Yaroslav II').
parent('Vsevolod Bolshoe Gnezdo', 'Konstantin I').
parent('Yaroslav II', 'Andrey').
parent('Andrey', 'Vasiliy').
parent('Vasiliy', 'Konstantin II').
parent('Konstantin II', 'Dmitriy Suzdalskiy').
parent('Yaroslav II', 'Vasiliy Kostramskoy').
parent('Yaroslav II', 'Yaroslav III Tverskoy').
parent('Yaroslav III Tverskoy', 'Mikhail II Svyatoy').
parent('Mikhail II Svyatoy', 'Alexandr II').
parent('Yaroslav II', 'Alexandr Nevskiy').
parent('Alexandr Nevskiy', 'Andrey Gorodeckiy').
parent('Alexandr Nevskiy', 'Dmitriy Pereyaslavskiy').
parent('Alexandr Nevskiy', 'Daniil Moskovskiy').
parent('Daniil Moskovskiy', 'Yuriy III Moskovskiy').
parent('Daniil Moskovskiy', 'Ioan I Kalita').
parent('Ioan I Kalita', 'Simeon Gordiy').
parent('Ioan I Kalita', 'Ioan II Krotkiy').
parent('Ioan II Krotkiy', 'Dmitriy Donskoy').
parent('Dmitriy Donskoy', 'Vasiliy I').
parent('Vasiliy I', 'Vasiliy II Temniy').
parent('Vasiliy II Temniy', 'Ioan III').
parent('Ioan III', 'Vasiliy III').
parent('Vasiliy III', 'Ioan IV').
parent('Ioan IV', 'Fedor').

relations(X,Z) :- parent(X,Z).
relations(X,Z) :- parent(X,Y), ancestor(Y,Z).
?- relations('Rurik', 'Oleg').