我的递归 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.
我对 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.