我的递归Prolog谓词不起作用(总是只是假错)

时间:2015-04-11 00:54:22

标签: recursion prolog

我遇到了Prolog的问题。我目前正在尝试使用Prolog教程,但我仍然坚持使用递归。尽管我已经被告知做了所有事情,但我没有得到正确的结果。我也找不到我犯的错误..

首先,这是指向the tutorial的链接。

现在这是我的问题。我有以下代码: (由于这个问题并不重要,我放弃了其余部分)

location(desk, office).
location(apple, kitchen).
location(flashlight, desk).
location('washing machine', cellar).
location(nani, 'washing machine').
location(broccoli, kitchen).
location(crackers, kitchen).
location(computer, office).
location(envelope, desk).
location(stamp, envelope).
location(key, envelope).

is_contained_in(T1,T2):-
  location(X,T2),
  is_contained_in(T1,X).

现在可以预期,请求is_contained_in(X, office).应该列出办公室内或办公室内所有物品的清单。同样请求is_contained_in(key, office).应该是真的。但结果总是假的(没有列表,没有任何内容,只有false),无论我尝试什么。

我也尝试将递归谓词更改为以下内容:

is_contained_in(T1,T2):-
  location(X,T2),
  write(X), nl,
  is_contained_in(T1,X).

Prolog实际上会记下办公室里的所有东西以及事后的错误。递归循环显然确实有效。但我无法弄清楚为什么它不能用于is_contained_in(key, office).之类的查询。他确实意识到T1在循环中的某个点上是关键,但它最终仍然不会写入。

如果我的英语不是很好,我很抱歉。我只是希望你理解我的问题,你可以帮助我! :)

此致

1 个答案:

答案 0 :(得分:2)

与命令式编程一样,递归由两个属性定义:
1-一个简单的基本案例(或案例) 2-一组规则,将所有其他案例减少到基本案例 在您的情况下,您没有定义基本情况,在这个特定问题中,如果您的知识库(程序)中存在事实位置(对象,位置),则“包含在”位置中。
这可以通过在谓词中添加一个is_contained_in/2来解决,它代表基本情况:

is_contained_in(T1,T2):-      % Base case
  location(T1,T2).
is_contained_in(T1,T2):-      % General rule
  location(X,T2),
  write(X), nl,
  is_contained_in(T1,X).

测试:

?- is_contained_in(key,office).
true.

?- is_contained_in(Object,office).  
Object = desk ;  
Object = computer ;  
Object = flashlight ;  
Object = envelope ;  
Object = stamp ;  
Object = key ;  
false.