我正在尝试创建一个看起来像这样的语义网络:。
到目前为止,我已经建立了一些基本事实,例如isa(man,person)
或hasa(person,node)
。
如果我创建一个Person的实例,例如isa(mark,father)
,然后查询height(mark,Height)
,我会得到错误的结果。我了解我必须以某种方式进一步开发height(Person,Height)
以及isa(X,Y)
和hasa(X,Y)
的定义,但是不确定如何解决此问题。
我想发生的事情是能够查找,例如height(mark,Height)
并获得195
或hasa(mark,X)
并获得body
。
答案 0 :(得分:2)
对于第一个问题,您需要一个带有变量的规则。换句话说,您可以指定规则
如果X的类型为T,而T的类型的高度为H,则X的高度为H。
在这种情况下
如果mark是父亲,而父亲的身高为195,则mark的身高为195。
在序言中:
height(X,H) :- isa(X,T), height(T,H).
对于第二个问题,您需要一个递归规则。换句话说:
如果X的类型为T,而T的类型的元素为E,则X的元素为E。
措辞:
如果X的类型为T而X的元素为E,则X的元素为E。
从第二条语句中可以看到,具有元素的规则包含在定义中。这是递归,它允许规则自动将自身扩展到多个级别。在当前示例中,第一个扩展为:
如果X的类型为T,而T的类型为Z,而Z的类型为E,则X的元素为E。
在该示例中,将为:
如果X是父亲,父亲是男人,而男人有身体,则X具有身体。
只要有isa
条语句具有正确的可用值,这种扩展就可以继续(在这种情况下,我们需要再进行一次扩展)。最后一个扩展不使用该规则,而是匹配一个简单事实(在这种情况下为hasa(person,body)
)。在序言中:
hasa(X,E) :- isa(X,Z), hasa(Z,E).
完整示例:
% isa: general facts
isa(father,man).
isa(man,person).
% isa: specific facts
isa(mark,father).
% height: general facts
height(father,195).
% height: rules
height(X,H) :- isa(X,T), height(T,H).
% hasa: general facts
hasa(person,body).
% hasa: rules
hasa(X,E) :- isa(X,Z), hasa(Z,E).
查询:
?- height(mark,Height).
Height = 195 .
?- hasa(mark,X).
X = body .