我正试图在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).
答案 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).