【发布时间】:2017-03-06 22:41:38
【问题描述】:
我想在prolog中定义如下规则:
当X口渴时,X应该去酒吧。
之后,我会问 prolog thirsty(X),prolog 应该回馈 go(bar)
我已经尝试过以下方式:
go(Y).
thirsty(X) :- go(bar).
但是当我用它测试时
thirsty(bob).
结果只会是true。有人可以帮我改变什么才能得到go(bar)吗?
【问题讨论】:
标签: prolog
我想在prolog中定义如下规则:
当X口渴时,X应该去酒吧。
之后,我会问 prolog thirsty(X),prolog 应该回馈 go(bar)
我已经尝试过以下方式:
go(Y).
thirsty(X) :- go(bar).
但是当我用它测试时
thirsty(bob).
结果只会是true。有人可以帮我改变什么才能得到go(bar)吗?
【问题讨论】:
标签: prolog
go(Y). 通常并不意味着什么,也许除了去任何地方。当您在 Prolog 中断言规则时,您应该能够为它们分配一些语义含义。你的规则说,如果X 口渴,那么bar 是一个可以去的地方这当然总是成功的,因为bar 总是一个可以去的地方,就像你在其他地方一样可能想按照你的规则去,go(Y)。由于您没有在 thirsty(X) 谓词子句主体中的任何地方使用 X,因此它从未使用过(因此您可能看到了关于此的单例变量警告)。
在 Prolog 中定义一个好的规则首先是要以一种明智的方式陈述你的规则。也许涉及一个人的合理规则可能是:
Person去酒吧如果Person口渴了。
这可以表述为:
go_bar(Person) :- thirsty(Person).
或者更一般地说,
goes(Person, bar) :- thirsty(Person).
goes(Person, restaurant) :- hungry(Person).
然后您需要断言有关此人的一些事实(或向用户查询这些事实):
thirsty(bob).
确认这一事实后,可能会产生以下查询:
?- goes(bob, X).
X = bar
【讨论】:
当
X口渴时,X应该去酒吧。
看这句话的第一部分,“当X 口渴时”,显然X 可以有一个属性口渴,所以thirsty 听起来是一个很好的谓词(thirsty(X) 表示X口渴了)。
然后有几种方法可以查看句子的第二部分,“X应该去酒吧”,我将在下面写一些以增加复杂性,最后一个是我认为你想要的:
X的一个属性,在这种情况下,您可以将谓词should_go_to_the_bar定义为谓词,这样should_go_to_the_bar(X)就意味着X应该去酒吧。 那么你的程序可以是:
thirsty(bob).
should_go_to_the_bar(X) :- thirsty(X).
?- should_go_to_the_bar(bob).
True
X和the_bar之间的关系,所以should_go_to(X, the_bar)表示X应该去the_bar。 那么你的程序可以是:
thirsty(bob).
should_go_to_the_bar(X, the_bar) :- thirsty(X).
?- should_go_to(bob, X).
X = the_bar
go_to(X, the_bar) 这样的动作的属性,所以should(go_to(the_bar)) 意味着它应该是go_to(X, the_bar)。 那么你的程序可以是:
thirsty(bob).
should(go_to(X, the_bar)) :- thirsty(X).
?- should(X).
X = should(go_to(bob, the_bar))
X 和他们可以像 go_to(X, the_bar) 这样的动作之间的关系,所以 should(X, go_to(X, the_bar) 意味着 X 应该 go_to(X, the_bar)即 X 应该使“X 去酒吧”成为真的。那么你的程序可以是:
thirsty(bob).
should(X, go_to(X, the_bar)) :- thirsty(X).
?- should(bob, Action).
Action = go_to(bob, the_bar)
我认为最后一个解释最接近你想要的。
【讨论】:
thirsty(bob) 是您认为正确的事实,它应该在程序中(而不是我之前写的查询)。现在它按预期工作。在程序中声明了 bob 口渴,并声明了与他应该做什么的关系,然后查询询问 bob 应该做什么。
thirsty(bob) 的事实,并在之后添加 thirsty(bob)(并在之后删除它)?
assert() 和 retract() 解决问题。