我的递归 Prolog 谓词不起作用(总是给出 false)

My recursive Prolog predicate does not work (always just gives out false)

我对 Prolog 有疑问。我目前正在尝试学习 Prolog 教程,但我坚持使用递归。尽管按照我所说的做了所有事情,但我没有得到正确的结果。我也找不到我犯的错误..

首先,这里是link到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在循环的某个时刻是key,但最后还是不会写成true

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

此致

与命令式编程一样,递归由两个属性定义:
1- 一个简单的基本案例(或案例)。
2- 一组将所有其他情况减少到基本情况的规则。
在您的情况下,您没有定义基本情况,在这个特定问题中,如果您的知识库(程序)中存在事实位置(对象,位置),则对象 "is contained in" 位置。
这可以通过在谓词中添加一个子句 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.