prolog中的关系链

时间:2017-05-06 11:20:40

标签: prolog

father(Father,Child).
mother(Mother,Child).

{ father(Raja,Raj), mother(Rani, Roop) }

在关系数据库中如何回答诸如“”X如何与Y相关的问题?, 例如 - 如何为“Raj如何与Raja相关”编写规则,以便回答Raja是Raj的父亲。

1 个答案:

答案 0 :(得分:1)

我会尝试提供帮助,介绍我认为有用的内置谓词。 但首先,我们应该同意数据库术语。最需要的规范是关于模块:在SWI-Prolog中,所有谓词都存在于某个模块中,但是我们可以简单地忽略这个特性,并且从你的例子中选择不合格的二元关系。

启动SWI-Prolog后,您可以看到运行

的谓词数量
?- aggregate(count,X^current_predicate(X),N).
N = 1034.

并且只获得二元关系

?- aggregate(count,X^current_predicate(X/2),N).
N = 371.

您的实际值很可能会有所不同。现在让我们输入你的数据库'事实,只是引用原子(否则我们有变量,或者更好,单身):

?- [user].
father('Father','Child').
|: mother('Mother','Child').
|: ^Dtrue.

现在

?- aggregate(count,X^current_predicate(X/2),N).
N = 373.

正如预期的那样,还有两个二元谓词。

现在,第2条将回答你的问题:

?- V='Child', current_predicate(R/2), C=..[R,U,V], clause(C,B), call(B).
V = 'Child',
R = father,
C = father('Father', 'Child'),
U = 'Father',
B = true ;
V = 'Child',
R = mother,
C = mother('Mother', 'Child'),
U = 'Mother',
B = true 

到目前为止,我们发现父亲/ 2和母亲/ 2都是有“儿童”作为正确论据的有效关系。唉,进一步的回溯会引发(意外)错误:

...
U = 'Mother',
B = true ;
ERROR: No permission to access private_procedure `(is)/2'
ERROR: In:
ERROR:    [9] clause(_7524 is 'Child',_7520)
ERROR:    [8] '<meta-call>'(user:(...,...)) <foreign>
ERROR:    [7] <user>

而且,再次唉,predicate_properties / 2似乎已经破了,所以我现在无法想到避免错误的正确方法......