Пролог SWI - Использование предиката с другим предикатом - PullRequest
0 голосов
/ 25 ноября 2018

Я относительно новичок в прологе, и я постараюсь объяснить это как можно лучше.Скажем, у меня есть небольшая база знаний о ресторанах, в которых есть название, кухня и цена.

restaurant(spaghetti, italian, 20).
restaurant('naan bread', indian, 30).
...

И у меня есть люди, которым нравятся определенные рестораны, такие как:

likes(adam, restaurant, italian).

Где Адам любит итальянские рестораны.Основная проблема, с которой я сталкиваюсь, заключается в том, что, если я делаю запрос, такой как:

likes(adam, spaghetti).

или

likes(adam, _, spaghetti).

Он приходит только с ложью, независимо от того, что я поставил.Я провел много исследований, но, похоже, не могу заставить его работать - так как я новичок в прологе, я действительно не понимаю этого.Я просмотрел такие книги, как «Программирование на прологе» Клоксина и Меллиша, а также различные веб-сайты, но я не могу найти ответ или тот, который понимаю.

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Итак, давайте просто скажем, что у вас есть следующие факты, как указано в вашем вопросе, без лишних и без изменений:

restaurant(spaghetti, italian, 20).
restaurant('naan bread', indian, 30).

likes(adam, restaurant, italian).

Теперь вы хотели бы задать вопрос: «Какое блюдо любит Адам?? "

Мы можем добавить это простое правило:

likes(Person, Dish) :-
    likes(Person, restaurant, Type),
    restaurant(Dish, Type, _).

Теперь вы можете пойти дальше и спросить следующее:

?- likes(adam, Dish), write(Dish).

Это выплевывает ответ spaghetti.

0 голосов
/ 26 ноября 2018

На основании вашего комментария

Это только база знаний ресторанов.Других правил нет.

мы возьмем их оттуда и начнем с заданных правил.

restaurant(spaghetti, italian, 20).
restaurant('naan bread', indian, 30).

Далее идет запрос, который вы пытаетесь

likes(adam, spaghetti).

Это верно, но, как мы отмечаем в комментариях, некоторые факты отсутствуют.

Самый простой факт, чтобы сделать запрос правильным, был бы

likes(adam, spaghetti).

, но выесть другие запросы, такие как

likes(adam, restaurant, italian).

и факты, такие как

restaurant('naan bread', indian, 30).

, которые предполагают, что вы знаете, что существуют отношения между четырьмя сущностями, adam, itialian и spaghetti, 20 (цена).

Существуют бесконечные способы создания отношений, но для этого примера мы будем держать его более простым.

person(adam).
person(mary).

food_nationality(spaghetti, italian).
food_nationality(hamburger, americian).
food_nationality('naan bread', indian).

food_price(spaghetti, 20).
food_price(hamburger, 30).
food_price('naan bread', 30).

likes(adam,italian).
likes(mary,american).

Теперь, когда у нас есть некоторыефакты, если вы хотите узнать, сколько стоит Адаму съесть понравившуюся ему пищу, мы начнем с фактов и посмотрим, к чему мы можем прийти.

Мы видим факт

person(adam).

, но этотолько говорит нам, что Адам - ​​человек, и не приводит к дополнительной информации по нашему вопросу.

Мы также видим факт

likes(adam,italian).

, который говорит нам, что Адам любит итальянский, но не дает нам особой еды.

Мы также видим

food_nationality(spaghetti, italian).

Такмы знаем, что Адам любит итальянский, а у итальянского есть спагетти, но нам все еще нужна цена.

Мы также видим,

food_price(spaghetti, 20).

Итак, мы знаем, что Адам любит итальянский, а у итальянского есть спагетти и спагетти, стоимость которых равна 20.ответ заключается в том, что для Адама есть то, что ему нравится, это будет стоить 20.

В качестве предиката Пролога это будет

cost_to_eat(Person,Price) :-
   likes(Person,Nationality),
   food_nationality(Food, Nationality),
   food_price(Food, Price).

и запуск этого для Адама

?- cost_to_eat(adam,Price).
Price = 20.

Это также работает для Мэри

?- cost_to_eat(mary,Price).
Price = 30.

, и это также работает, если вы даете только цену

?- cost_to_eat(Person,20).
Person = adam ;
false.

, и это также работает, вы спрашиваете

?- cost_to_eat(Person,Cost).
Person = adam,
Cost = 20 ;
Person = mary,
Cost = 30.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...