我想在prolog中定义以下规则:
当X
口渴时,X
应该去吧。
thirsty(X)
并且prolog应该回馈go(bar)
我尝试过以下方式:
go(Y).
thirsty(X) :- go(bar).
但是当我用
进行测试时thirsty(bob).
结果只有true
。有人可以帮助我改变我的结果以获得go(bar)
吗?
答案 0 :(得分:3)
go(Y).
通常并不意味着什么,除了随时随地。当您在Prolog中断言规则时,您应该能够为它们分配一些语义含义。您的规则是,如果X
口渴,那么bar
就是一个可以去的地方当然总是成功,因为bar
总是一个可以去的地方,根据您的规则go(Y)
,您可能想要去的任何其他地方也是如此。由于您没有在X
谓词子句正文中的任何位置使用thirsty(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
答案 1 :(得分:1)
当
X
口渴时,X
应该去吧。
看看这句话的第一部分,“当X
口渴时”,显然有X
可以拥有的财产,所以thirsty
听起来像是一个好的谓词({ {1}}表示thirsty(X)
口渴。
然后有几种方法可以看到句子的第二部分,“X
应该去吧”,我会在下面写一些以增加复杂性的顺序,最后一个是我认为你想要:
X
的属性,在这种情况下,您可以将谓词X
定义为谓词,以便should_go_to_the_bar
表示{{1}应该去吧。然后你的程序可以是:
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
表示X应该转到the_bar。 然后你的程序可以是:
the_bar
should_go_to(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)。 然后你的程序可以是:
go_to(X, the_bar)
should(go_to(the_bar))
与他们可以执行的行为之间的关系thirsty(bob).
should(go_to(X, the_bar)) :- thirsty(X).
?- should(X).
X = should(go_to(bob, the_bar))
,因此X
表示X应该是go_to(X,the_bar)即X应该使“X进入条形图”。然后你的程序可以是:
go_to(X, the_bar)
我认为最后的解释最接近你想要的。