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

Recursion 我的递归Prolog谓词不起作用(总是给出false),recursion,prolog,Recursion,Prolog,我对序言有问题。我目前正在尝试学习Prolog教程,我被递归所困扰。尽管我按照别人告诉我的做了每件事,但我没有得到正确的结果。我也找不到我犯的错误 首先,这里是到的链接 现在是我的问题。我有以下代码: (我省去了其余的部分,因为这与这个问题无关) 现在可以预期,请求包含在(X,office)中。应该给我一个列表,列出办公室内或办公室内部的所有东西。请求的也包含在(钥匙、办公室)中。应为true。但是不管我怎么做,结果总是错误的(没有列表也没有,只是false) 我还尝试将递归谓词更改为以下内容:

我对序言有问题。我目前正在尝试学习Prolog教程,我被递归所困扰。尽管我按照别人告诉我的做了每件事,但我没有得到正确的结果。我也找不到我犯的错误

首先,这里是到的链接

现在是我的问题。我有以下代码: (我省去了其余的部分,因为这与这个问题无关)

现在可以预期,请求
包含在(X,office)中。
应该给我一个列表,列出办公室内或办公室内部的所有东西。请求的
也包含在(钥匙、办公室)中。
应为true。但是不管我怎么做,结果总是错误的(没有列表也没有,只是
false

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

is_contained_in(T1,T2):-
  location(X,T2),
  write(X), nl,
  is_contained_in(T1,X).
Prolog实际上会写下办公室里的所有事情,以及事后的错误。递归循环显然是有效的。但是我不明白为什么它不能处理诸如
包含在(key,office)中之类的查询。
。他确实意识到T1在循环中的某个点上是关键的,但最终它仍然不会写为真

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


与命令式编程类似,递归由两个属性定义:
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_包含在(T1,T2):-位置(T1,T2)。包含在(T1,T2)中吗?——位置(X,T2),位于(T1,X)中。但如果有人能向我解释,为什么教程中给出的例子(我在原始帖子中写的)不起作用,我还是会很高兴的。我不明白(你所拥有的,仅仅是一条规则,里面没有“或”。现在,有了这两条规则,你得到了“或”。谢谢你的回答!:)我想我现在明白了。我将试着掌握序言!:)
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.