father(Father,Child).
mother(Mother,Child).
{ father(Raja,Raj), mother(Rani, Roop) }
在关系数据库中如何回答诸如“”X如何与Y相关的问题?, 例如 - 如何为“Raj如何与Raja相关”编写规则,以便回答Raja是Raj的父亲。
答案 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似乎已经破了,所以我现在无法想到避免错误的正确方法......