"НЕ СУЩЕСТВУЕТ" в swi-прологе - PullRequest
1 голос
/ 24 сентября 2011

Я застрял на простой проблеме в прологе. Давайте рассмотрим программу

worker(bill).
worker(smitt).
worker(fred).
worker(dany).
worker(john).
car(bmw).
car(mazda).
car(audi).
owner(fred,mazda).
owner(dany,bmw).
owner(john,audi).

Мне нужно добавить еще один предикат no_car (X), который будет истинным, если у рабочего X нет машин, т.е. если мы введем запрос ?: - no_car (X). Пролог должен ответить

X=smitt,
X=bill,
yes 

То, что я сделал, это

   hascar(X):-owner(X,_).
   nocar(X):- worker(X),not hascar(X).

Но этот подход не работает, потому что анонимные переменные доступны только для запросов. Итак, я действительно застрял на этом. Я знаю, что в SQL есть слова «НЕ СУЩЕСТВУЕТ», которые позволяют выразить эту логику в запросе, но есть ли что-то похожее на них в прологе?

1 Ответ

5 голосов
/ 24 сентября 2011

Следующее работает для меня и дает ожидаемый результат:

no_car(W):-
   worker(W),
   \+ owner(W, _).

Теперь это близко к тому, что у вас есть.С одной стороны, вы можете , конечно, использовать _ в предикатах;это не ограничено запросами.Я обычно использую \* для отрицания, а not выдает здесь синтаксическую ошибку!?

РЕДАКТИРОВАТЬ:

Ах!В моей, хотя и устаревшей, версии Пролога вы должны использовать not(hascar(X)), чтобы он работал, поэтому не / 1 нужно использовать как термин, а не как оператор.Но в руководстве также говорится, что not устарела в пользу \+.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...