首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Prolog规则帮助

Prolog规则帮助
EN

Stack Overflow用户
提问于 2010-02-20 21:37:50
回答 4查看 199关注 0票数 1

我是prolog的新手,正在尝试一些东西,特别是我在思考如何在Prolog中做一些特定的事情。我知道事实和规则,事实就是这类东西

代码语言:javascript
复制
specialCustomer(x).                     //person x is a specialcustomer

和规则:

代码语言:javascript
复制
totalSpend(x,500) :- specialCustomer(x).     //if x spends 500, he is a special customer

这个事实和规则在prolog中是有效的吗?这条规则是错的吗?如何通过prolog查询?就像在调用

代码语言:javascript
复制
totalSpend(bob,500).

是一个有效的调用?

抱歉,如果我是在回答我自己的问题,我只是看起来是一个困惑的bit...well!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-02-21 03:31:43

如果你想说鲍勃、吉姆和每个消费超过500美元的人都是特殊客户,那么定义一些人的支出,你可以这样定义:

代码语言:javascript
复制
specialCustomer(bob).
specialCustomer(jim).
specialCustomer(Who) :-
  totalSpend(Who, Amount),
  Amount >= 500.

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

然后您可以按如下方式查询它:

代码语言:javascript
复制
?- specialCustomer(jim).
true.

?- specialCustomer(mary).
false.

?- specialCustomer(jack).
true.

?- specialCustomer(pam).
true.

?- specialCustomer(X).
X = bob ;
X = jim ;
X = jack ;
X = pam.
票数 2
EN

Stack Overflow用户

发布于 2010-02-20 21:56:33

你写的所有东西在语法上都是有效的,但从你的评论来看,它似乎并不像你想要的那样。

代码语言:javascript
复制
specialCustomer(x).

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

代码语言:javascript
复制
totalSpend(x,500) :- specialCustomer(x).

这里你是说当specialCustomer(x)为真时,totalSpend(x,500)为真。既然您已经将特殊客户定义为true,那么您也可以编写

代码语言:javascript
复制
totalSpend(x,500).

您的注释使它看起来好像您认为:-之前的部分是它后面的部分的条件,但事实恰恰相反。

代码语言:javascript
复制
totalSpend(bob,500).

这里您正在询问totalSpend(bob,500)是否为真,但由于没有针对bob的规则,因此它将为false。

请注意,xbob是符号,而不是变量。所以specialCustomer(x)将是真的,但specialCustomer(bob)不是。

票数 1
EN

Stack Overflow用户

发布于 2010-02-20 22:03:42

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2302347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档