如何在SWI-Prolog中表示semnet

时间:2019-03-27 15:20:37

标签: prolog semantic-web

我正在尝试创建一个看起来像这样的语义网络:this

到目前为止,我已经建立了一些基本事实,例如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)并获得195hasa(mark,X)并获得body

1 个答案:

答案 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 .