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