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



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

首先,这里是教程的链接。

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

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).应该为true。但无论我尝试什么,结果总是错误的(没有列表,什么都没有,只有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-一个简单的基本情况
2-将所有其他情况减少为基本情况的一组规则
在您的案例中,您没有定义您的基本案例,在这个特定的问题中,如果您的知识库(程序)中有一个事实位置(Object,Location),则Object"包含在"Location中
这可以通过在谓词中添加子句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.