我在 Prolog 中使用继承的覆盖继承了错误的 属性 ?为什么?

My override using inheritance in Prolog is inheriting the wrong property ? why?

我正在尝试使用以下规则覆盖颜色属性:-

prop(color, bmw, yellow).
prop(color, audi, red).

maps(mycar, subset, bmw).

maps(hiscar, isa, audi).

%Rules
hasproperty(Property, Object, Value) :-
    maps(Property, Object, Value).

hasproperty(Property, Object, Value) :-
   maps(Object, subset, Parent);
   hasproperty(Property, Parent, Value),
   maps(Property, Ojbect, _).

hasproperty(Property, Object, Value) :-
   maps(Object, isa, Parent),
   hasproperty(Property, Parent, Value),
   maps(Property, Ojbect, _).

但是我得到了一个错误的值,它应该作为红色继承,但我却变成了黄色,为什么会这样?

17 ?- hasproperty(color, hiscolor, Z).
Z =  yellow.

应该是Z=红色

您的程序有很多错误,您应该在将文件加载到 prolog 后阅读警告。

  1. 为什么要在 hasproperty 谓词的第二个子句中使用 ;
  2. 您在最后两个子句中将 Object 拼写为 Ojbect
  3. 你为什么要在最后两个子句中声明 property(Property, Ojbect, _)
  4. 除非你有很好的理由,否则你应该在一个地方定义谓词的所有子句。不要像那样穿插 relproperty。如果你有充分的理由这样做,你必须使用 discontiguous 来声明它们。

Prolog 应该警告您有关 2 和 4 的信息。

在线加载SWISH中的代码,点击行号左侧设置跟踪点(红点),然后提交查询。您可以逐步执行代码,看看发生了什么。

它在 qe2 上寻找轮子,并找到 none。

然后它会寻找 qe2 作为任何东西的子集,不。

然后它寻找任何带轮子的东西,发现 land 有 4 个轮子 (??)。

然后它会寻找任何带轮子的东西(因为 Ojbect 的错别字,它不会寻找 qe2 - 谢谢 rajashekar!我不知道为什么它表现得很奇怪)。

发现陆地有4个轮子,并且存在有轮子的东西,所以成为第一个答案。

您的代码:

hasproperty(Property, Object, Value) :-
   rel(Object, subset, Parent);
   hasproperty(Property, Parent, Value),   <----- wheels, land, 4
   property(Property, Ojbect, _).          <--typo Ojbect

所以 4 来自陆地。