如何定义在序言简单的规则(How to define simple rule in prolog)

2019-09-30 14:07发布

我想定义在序言以下规则:

X是渴了, X应该去酒吧。

之后,我会问Prolog的thirsty(X)和序言应归还去(酒吧)

我已经尝试过的方式如下:

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

但是,当我与测试

thirsty(bob).

结果只会是true 。 有人可以帮助我什么,我不得不改变让go(bar)的结果呢?

Answer 1:

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)

我想,这最后的解释是最接近你想要什么。



Answer 2:

go(Y). 作为一项规则并不真正意味着什么,除了去任何地方,也许吧。 当你断言Prolog的规则,你应该能够在一定语义分配给他们。 您的规则说, 如果X是渴了,那么bar是去这当然总是成功的,因为一个地方 bar总是去的地方,因为是别的任何地方,你可能想去根据您的规则, go(Y) 。 既然你没有使用X你随时随地thirsty(X)谓语从句体,它从来没有使用过(所以你可能看到关于一个单变量警告)。

定义在序言一个很好的规则是第一个有关说明你的规则,首先一个明智的方式。 可能涉及一个人一个合理的规则可能是:

Person去酒吧,如果 Person是渴。

这可能被表述为:

go_bar(Person) :- thirsty(Person).

或者更一般地,

goes(Person, bar) :- thirsty(Person).
goes(Person, restaurant) :- hungry(Person).

然后,你需要断言关于人的一些事实(或查询这些事实的用户):

thirsty(bob).

随着这一事实断言,可能会导致以下查询:

?- goes(bob, X).
X = bar


文章来源: How to define simple rule in prolog
标签: prolog