【发布时间】:2015-09-26 22:01:05
【问题描述】:
我正在尝试在 prolog 中测试递归。根据下面的知识库和条件语句,我尝试进行递归调用,并希望使用专门用于“eastOf(X,Y) :- westOf(X,Z),eastOf(Z,Y)”的查询我使用的是“eastOf(ave,yonge)”,它应该使用该递归调用并声明 X 是 ave,Y 是 yonge,Z 是 CollegePark。然而,我正在使用当前(ECliPSe)的 proglog 程序给了我这个错误“***本地/控制堆栈溢出! 您可以使用“-l kBytes”(LOCALSIZE) 选项来获得更大的堆栈。 峰值大小为:本地堆栈 11024 kbytes,控制堆栈 120048 kbytes"
在我的 .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).
【问题讨论】:
-
谓词
eastOf(X,Y) :- westOf(X,Z), eastOf(Z,Y).不是一个好规则。它说X在Y的东边,如果X在Z的西边并且Z在Y的东边。这不一定是真的。 -
你能提供一个例子说明这不是真的吗?
-
当然:科罗拉多州丹佛市位于纽约州纽约市以西,纽约州纽约市位于伊利诺伊州芝加哥市以东,但科罗拉多州丹佛市不在伊利诺伊州芝加哥市以东。
-
所以从那个谓词中它实际上发现 X 在 Y 的北边而不是实际上在东边?对吗?
-
不,这还没有定论。除非您指的是不寻常的非球面几何,否则您无法从东或西关系中推断出北或南。如果您只是在谈论东方和西方,而您忽略了一个事实,即 A 可以在 B 的东方或 B 的西方,这取决于您环游地球的哪个方向,那么您可以说如果 A 在 B 的东方,并且B 在 C 的东边,然后 A 在 C 的东边。