2017-02-17 5 views
1

Предположим, у меня есть следующие факты:Пролог: Получить объект или объекты, которые не соответствуют факт

boy(a). 
boy(b). 
girl(c). 
girl(d). 

Если я запрашиваю:

?-boy(X). 

я получаю:

X=a; 
X=b. 

Какой запрос следует использовать с помощью переменной, чтобы получить объекты, которые не соответствуют правилу boy(), в этом случае c и d?

Я новичок в Прологе, поэтому я думал об использовании

?-not(boy(X)). 

Но это не правильно. Я использую swi-пролог. Заранее благодарим за ваше время и помощь.

ответ

3

Проблема с not(boy(X)) заключается в том, что Prolog не знает, что такое «вселенная возможных вариантов» для X, чтобы затем проверить, являются ли они мальчиком. Конечно, факты знают только мальчиков.

Один из подходов заключается в определении всех людей в дополнение к полу. Например:

% Define people 

person(a). 
person(b). 
person(c). 
person(d). 

% Define genders 

boy(a). 
boy(b). 
girl(c). 
girl(d). 

Затем, чтобы проверить для всех «не-мальчиков» вы могли бы сделать:

?- person(X), not(boy(X)). 

В зависимости от того, как вы хотите организовать ваши данные, вы можете совместить пол с человеком:

person(a, boy). 
person(b, boy). 
person(c, girl). 
person(d, girl). 

Тогда запрос:

?- dif(Y, boy), person(X, Y). 

Или записать его в качестве предиката:

person_not_of_gender(Person, Gender) :- 
    dif(OtherGender, Gender), 
    person(Person, OtherGender). 

Тогда запрос:

?- person_not_of_gender(Person, boy). 

 Смежные вопросы

  • Нет связанных вопросов^_^