Справка по Прологу - PullRequest
       10

Справка по Прологу

1 голос
/ 20 февраля 2010

Я новичок в Прологе и экспериментирую с некоторыми вещами, в частности я думаю о том, как сделать определенную вещь в прологе. Я осведомлен о фактах и ​​правилах, факты что-то в этом роде

specialCustomer(x).                     //person x is a specialcustomer

и правила:

totalSpend(x,500) :- specialCustomer(x).     //if x spends 500, he is a special customer

Будет ли этот факт и правило действительными в прологе? Правило ли это неправильно? Как бы я мог запросить это через пролог? Как в случае вызова

totalSpend(bob,500).

будет ли действительный звонок?

извините, если я отвечаю на свой вопрос, я, кажется, немного ... в замешательстве!

Ответы [ 4 ]

2 голосов
/ 20 февраля 2010

Если вы хотите сказать, что Боб, Джим и все, кто тратит более 500, являются особыми клиентами, то определите расходы некоторых людей, вы бы определили это следующим образом:

specialCustomer(bob).
specialCustomer(jim).
specialCustomer(Who) :-
  totalSpend(Who, Amount),
  Amount >= 500.

totalSpend(mary, 400).
totalSpend(jack, 600).
totalSpend(pam, 500).

Тогда вы бы запросили его следующим образом:

?- specialCustomer(jim).
true.

?- specialCustomer(mary).
false.

?- specialCustomer(jack).
true.

?- specialCustomer(pam).
true.

?- specialCustomer(X).
X = bob ;
X = jim ;
X = jack ;
X = pam.
1 голос
/ 20 февраля 2010

Может быть, вы хотите, чтобы х был переменной? Для этого это должен быть верхний регистр X.

1 голос
/ 20 февраля 2010

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

specialCustomer(x).

Здесь вы говорите, что specialCustomer (x) имеет значение true (а specialCustomer (any_else) имеет значение false).

totalSpend(x,500) :- specialCustomer(x).

Здесь вы говорите, что totalSpend (x, 500) имеет значение true, если specialCustomer (x) имеет значение true. Поскольку вы уже определили особого клиента как истинного, с тем же успехом вы могли бы написать

totalSpend(x,500).

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

totalSpend(bob,500).

Здесь вы спрашиваете, истинно ли totalSpend (bob, 500), но поскольку для bob нет правила, оно будет ложным.

Обратите внимание, что x и bob являются символами, а не переменными. Так что specialCustomer(x) будет правдой, но specialCustomer(bob) не будет.

0 голосов
/ 20 февраля 2010

То, что вы, вероятно, хотите выразить, это

speccust(bob).
totalSpend(X,500) :- speccust(X).

такой, что Боб - особый покупатель, а если кто-то потратил 500, то он особый покупатель. На практике вы могли бы сохранить это в файл, скажем customer.pl, и, например, в swi-prolog загрузить его, поместив ['customer.pl']. Затем вы можете поместить запросы в базу данных. В этом случае, возможно, вы захотите узнать, кто является особым клиентом, тогда вы заявите:

totalSpend (Кто, 500).

и получите Who = bob.

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