Prolog递归和堆栈问题

时间:2015-09-26 22:01:05

标签: recursion prolog

我正试图在prolog中测试递归。基于下面的KB和条件语句,我尝试进行递归调用,并希望使用专门用于“eastOf(X,Y): - westOf(X,Z),eastOf(Z,Y)”的查询我使用的是“eastOf(ave,yonge)”,它应该使用递归调用并声明X是ave,Y是yonge,Z是collegePark。然而我使用当前(ECliPSe)的proglog程序给我这个错误“***本地/控制堆栈的溢出! 您可以使用“-l kBytes”(LOCALSIZE)选项来获得更大的堆栈。 峰值大小为:本地堆栈11024千字节,控制堆栈120048千字节“

在我的.pl文件下面找到

eastOf(collegePark,yonge).
eastOf(sushi,eaton).
eastOf(X,Y) :- westOf(Y,X). 
eastOf(X,Y) :- westOf(X,Z), eastOf(Z,Y).

westOf(ellington,yonge). 
westOf(ryerson,sushi).
westOf(ave,collegePark).
westOf(X,Y) :- eastOf(Y,X).
westOf(X,Y) :- eastOf(X,Z), westOf(Z,Y).

2 个答案:

答案 0 :(得分:1)

我认为您打算使用eastOf(yonge,collegePark)作为您的第一个声明。现在它从来没有找到一个原子语句,以“ave”和“ave”开头。或者' yonge',并在eastOf(X,Y) :- westOf(Y,X)westOf(X,Y) :- eastOf(Y,X)之间保持循环。

答案 1 :(得分:1)

eastOf(X,Y) :- westOf(Y,X).

westOf(X,Y) :- eastOf(Y,X).

在这两个谓词的组合中发生了无限循环。 即使堆栈大小很大,也会发生大小过大。 我改变你的程序如下。

eastOf_data(collegePark,yonge).
eastOf_data(sushi,eaton).
eastOf(X,Y) :- westOf_data(Y,X). 
eastOf(X,Y) :- westOf_data(X,Z), eastOf_data(Z,Y).

westOf_data(ellington,yonge). 
westOf_data(ryerson,sushi).
westOf_data(ave,collegePark).
westOf(X,Y) :- eastOf_data(Y,X).
westOf(X,Y) :- eastOf_data(X,Z), westOf_data(Z,Y).