如何在 SWI-Prolog 中表示 semnet

How to represent semnet in SWI-Prolog

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

至此我只是设置了基本事实,例如isa(man,person)hasa(person,node)

如果我创建一个 Person 的实例,例如 isa(mark,father),然后查找 height(mark,Height),我会得到 false。我知道我必须以某种方式进一步发展 height(Person,Height) 以及 isa(X,Y)hasa(X,Y) 的定义,但我不确定如何去做。

我想要的是能够查找,例如,height(mark,Height) 并得到 195,或 hasa(mark,X) 并得到 body.

对于第一期,您需要一个带有变量的规则。用文字你可以指定规则,如

如果X是T类型,T类型的东西高度为H,那么X的高度为H。

在这种情况下

如果马克是父亲,父亲身高195,那么马克身高195。

序言中:

height(X,H) :- isa(X,T), height(T,H).

对于第二个问题,您需要一个递归规则。言外之意:

如果 X 是类型 T 并且类型 T 的东西有元素 E 那么 X 有元素 E.

改写:

如果 X 是类型 T 并且类型 T 的事物具有元素 E,则 X 具有元素 E。

从第二条语句可以看出,has element 的规则在定义中包含了自身。这就是递归,它允许规则自动扩展到多个级别。在当前示例中,第一个扩展将是:

X 有元素 E 如果 X 是类型 T 并且类型 T 的东西是类型 Z 并且类型 Z 的东西有元素 E.

在示例中,这将是:

X 有 body 如果 X 是父亲,父亲是男人,男人有 body

只要有 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 .