我是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).
是有效的电话吗?
对不起,如果我回答我自己的问题,我似乎有点......很困惑!
答案 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没有规则,所以它将是假的。
请注意,x
和bob
是符号,而不是变量。因此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。