Prolog递归可能无法在适当的边界条件下退出

问题描述 投票:0回答:1

提供以下数据库:

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(X, Y) :-
    location(Z, Y),
    is_contained_in(X, Z).

我希望以下查询

is_contained_in(Y, kitchen).

产生所有物品都在厨房内部。相反,我得到的所有输出都是false。此外,我希望我的查询能够向我提供一个包含在厨房中的所有物品的清单,无论它们是否在其他物品中。

为什么is_contained_in谓词在查询is_contained(Y,kitchen)中没有给我期望的结果。

recursion functional-programming prolog swi-prolog logic-programming
1个回答
0
投票

问题是,当is_contained_in(X, Y)直接位于X中时,Y没有匹配的条件,并且由于任何包含关系最终都将需要直接位置来匹配,因此找不到任何内容。您需要一个额外的子句来处理这种情况:

is_contained_in(X, Y) :- location(X, Y).
© www.soinside.com 2019 - 2024. All rights reserved.