我遇到了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在循环中的某个点上是关键,但它最终仍然不会写入。
如果我的英语不是很好,我很抱歉。我只是希望你理解我的问题,你可以帮助我! :)
此致
答案 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.