我正在处理我的第一个 Prolog 任务,并且在递归问题上,我似乎无法停止溢出堆栈。就像上瘾一样;我不知道怎么停下来。
让我给你举个例子。我想创建一个函数来确定一个对象 Y 是否是另一个对象 X 的一部分。这是我正在使用的数据库:
% Parts Database
has(bicycle,wheel,2).
has(bicycle,handlebar,1).
has(bicycle,brake,2).
has(wheel,hub,1).
has(wheel,spoke,32).
has(bicycle,frame,1).
has(car,steering_wheel,1).
has(car,stereo,1).
has(car,tires,4).
从这里开始,我想编写一个函数partof(X,Y)
,如果 Y 是 X 的一部分,则返回 true。这就是我目前拥有的:
% Determines if Y is a part of X
partof(X,Y) :-
has(X,Y,_).
partof(X,Y) :-
partof(X,Z),
partof(Z,Y).
这适用于所有true
查询,但会溢出堆栈而不是返回false.
例如:
?- partof(wheel, spoke).
true ;
ERROR: Out of local stack
?- partof(bicycle, spoke).
true ;
ERROR: Out of local stack
?- partof(wheel, X).
X = hub ;
X = spoke ;
ERROR: Out of local stack
我知道你们都在想,“这个愚蠢的白痴,不知道什么是基本情况。不知道如何退出递归。” 好吧,我不怪你。我觉得很笨。不过,一些耐心的指导会很有帮助。提前致谢!