如何在prolog中定义简单规则

时间:2017-03-05 16:48:26

标签: prolog

我想在prolog中定义以下规则:

X口渴时,X应该去吧。

之后,我会问prolog thirsty(X)并且prolog应该回馈go(bar)

我尝试过以下方式:

go(Y).
thirsty(X) :- go(bar).

但是当我用

进行测试时
thirsty(bob).

结果只有true。有人可以帮助我改变我的结果以获得go(bar)吗?

2 个答案:

答案 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应该去吧”,我会在下面写一些以增加复杂性的顺序,最后一个是我认为你想要:

  1. 一个是“应该去吧”是X的属性,在这种情况下,您可以将谓词X定义为谓词,以便should_go_to_the_bar表示{{1}应该去吧。
  2. 然后你的程序可以是:

    should_go_to_the_bar(X)
    1. 另一个是“应该去”可能是Xthirsty(bob). should_go_to_the_bar(X) :- thirsty(X). ?- should_go_to_the_bar(bob). True 之间的关系,因此X表示X应该转到the_bar。
    2. 然后你的程序可以是:

      the_bar
      1. 另一个是“应该”可能是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)。
      2. 然后你的程序可以是:

        go_to(X, the_bar)
        1. 最后我会说,“应该”可能是某个人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进入条形图”。
        2. 然后你的程序可以是:

          go_to(X, the_bar)

          我认为最后的解释最接近你想要的。