【问题标题】:How to define simple rule in prolog如何在 prolog 中定义简单的规则
【发布时间】: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


    【解决方案1】:

    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
    

    【讨论】:

      【解决方案2】:

      X口渴时,X应该去酒吧。

      看这句话的第一部分,“当X 口渴时”,显然X 可以有一个属性口渴,所以thirsty 听起来是一个很好的谓词(thirsty(X) 表示X口渴了)。

      然后有几种方法可以查看句子的第二部分,“X应该去酒吧”,我将在下面写一些以增加复杂性,最后一个是我认为你想要的:

      1. 一个是“应该去酒吧”是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
      
      1. 另一个是“应该去”可能是Xthe_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
      
      1. 另一个是“应该”可能是像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))
      
      1. 最后我要说的是,“应该”可能是一个人 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)
      

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

      【讨论】:

      • 当我尝试你的最后一个程序时,我总是收到一条错误消息:` Undefined procedure: thirsty/1` 你能帮我解决这个问题吗?
      • @Bennodual 是的,对不起,我犯了一个错误,因为thirsty(bob) 是您认为正确的事实,它应该在程序中(而不是我之前写的查询)。现在它按预期工作。在程序中声明了 bob 口渴,并声明了与他应该做什么的关系,然后查询询问 bob 应该做什么。
      • - 感谢您的最后回复。它现在以这种方式工作。还有一个小问题:我可以加载程序(没有 thirsty(bob) 的事实,并在之后添加 thirsty(bob)(并在之后删除它)?
      • 对不起 - 我要求禁食。我找到了:assert()retract() 解决问题。
      • @BennoDual 太好了! :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多