Использовать правило, если факт не существует в прологе? - PullRequest
1 голос
/ 05 мая 2020

Я новичок в прологе. Идея моего проекта заключается в том, чтобы сказать: «Комната X свободна, если никто не является гостем X, а X занимает, если семья живет в X». Я использую предикат

guest(FamilySurname,RoomTaken)

Это означает, что эту комнату заняла семья.

taken(X) :- guest(_,X).

Итак, если семья живет в комнате X, то берется X.

Моя проблема в том, как я могу сказать, что комната X свободна? Я должен использовать своего рода НЕ, например:

free(X) :- "NOT EXIST" guest(_,X).

Как я могу перевести это «НЕ СУЩЕСТВУЕТ» в прологе? Я пробовал с! но он не работает должным образом ... может я неправильно его размещаю.

Извините за мой английский sh.

Ответы [ 2 ]

1 голос
/ 05 мая 2020

Проверьте следующий код:

taken(X, Y) :- guest(Y,X).
free(X) :- \+ guest(_,X).

Я сделал небольшое изменение, чтобы принять, теперь он показывает вам, кто находится в этой комнате.

guest(albert, 123).

?- taken(123, R).

R = albert.

И бесплатный () предикат это довольно просто, я использовал оператор отрицания, вы можете проверить Как отрицать в Prolog

0 голосов
/ 05 мая 2020

Код в первом ответе не кажется решением, т.е. запрос ?- free(X) не даст ответа, тогда как запрос ?- free(foo) будет успешным. Необходимо учитывать ошибки запроса в Prolog , т.е. все переменные

Рассмотрим следующий код, в котором две альтернативы для представления предиката free.

 room(123).
 room(124).
 guest(albert, 123).

 taken(Room) :- guest(_, Room).

 free2(Room) :- room(Room),
                \+ taken(Room).

 free(Room) :- room(Room),
               forall(guest(_, RoomTaken),
                      RoomTaken \= Room). 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...