Prolog规则帮助

时间:2010-02-20 13:37:50

标签: prolog

我是Prolog的新手,正在尝试一些东西,特别是我正在思考如何在prolog中做某件事。我知道事实和规则,事实属于某种类型

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

和规则:

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

这个事实和规则在prolog中是否有效?规则错了吗?我怎么能通过prolog查询?如同

的召唤一样
totalSpend(bob,500).

是有效的电话吗?

对不起,如果我回答我自己的问题,我似乎有点......很困惑!

4 个答案:

答案 0 :(得分:2)

如果你想说Bob,Jim和花费超过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 :(得分:1)

你写的所有内容在语法上都是有效的,但是根据你的评论,它看起来并不像你想要的那样。

specialCustomer(x).

这里你说specialCustomer(x)是真的(而specialCustomer(anything_else)是假的。)

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

如果specialCustomer(x)为true,则表示totalSpend(x,500)为true。既然您已经将特殊客户定义为真,那么您也可以编写

totalSpend(x,500).

你的评论看起来好像你认为:-之前的部分是其之后的部分的条件,但它是相反的。

totalSpend(bob,500).

这里你要问的是totalSpend(bob,500)是否为真,但由于bob没有规则,所以它将是假的。

请注意,xbob是符号,而不是变量。因此specialCustomer(x)将成立,但specialCustomer(bob)将不会。

答案 2 :(得分:1)

也许你想让x成为一个变量?为此,它必须是一个大写X.

答案 3 :(得分:0)

您可能希望表达的是

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

这样bob是一个特殊的客户,如果有人花了500,那么他就是一个特殊的客户。 在实践中,您可以将其保存到文件,例如customer.pl,例如在swi-prolog中通过放置['customer.pl']来加载它。 然后,您可以将查询放入数据库。在这种情况下,您可能想知道谁是特殊客户,然后您会说:

totalSpend(Who,500)。

并收到Who = bob。