Мое переопределение с использованием наследования в Прологе наследует неправильное свойство ? почему?

#inheritance #prolog #overriding

Вопрос:

Я пытаюсь переопределить свойства цвета, используя приведенные ниже правила :-

 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= красный

Ответ №1:

В вашей программе много ошибок, вы должны прочитать предупреждения после загрузки файла в prolog.

  1. Почему вы используете ; во втором предложении hasproperty предикат?
  2. Вы написали Object так, как Ojbect в двух последних пунктах.
  3. Почему вы property(Property, Ojbect, _) вообще утверждаете в последних двух пунктах?
  4. Если у вас нет очень веской причины, вы должны определить все предложения предиката в одном месте. Не перемежайте rel и property тому подобное. И если у вас есть веская причина для этого, вы должны использовать discontiguous ее, чтобы объявить их таковыми.

Пролог должен был предупредить вас о 2 и 4.

Ответ №2:

Загрузите свой код в SWISH online и нажмите слева от номеров строк, чтобы установить точки трассировки (красные точки), а затем отправьте свой запрос. Вы можете шаг за шагом просматривать код и видеть, что происходит.

СВИСТЯЩИЙ след кода задающего вопрос

Он ищет колеса на qe2 и не находит ни одного.

Затем он ищет qe2 как подмножество чего угодно, нет.

Затем он ищет что-нибудь с колесами и находит land , что у него 4 колеса (??).

Затем он ищет что — нибудь с колесами (из-за опечатки Ojbect он не ищет qe2- спасибо раджашекару! Я был в тупике, почему это вело себя странно).

Он обнаружил, что земля имеет 4 колеса, и существует что-то с колесами, так что это становится первым ответом.

Ваш код здесь:

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

Итак, 4 приходит с суши.