【问题标题】:Prolog recursion and stack issueProlog递归和堆栈问题
【发布时间】: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). 不是一个好规则。它说 XY 的东边,如果 XZ 的西边并且 ZY 的东边。这不一定是真的。
  • 你能提供一个例子说明这不是真的吗?
  • 当然:科罗拉多州丹佛市位于纽约州纽约市以西,纽约州纽约市位于伊利诺伊州芝加哥市以东,但科罗拉多州丹佛市不在伊利诺伊州芝加哥市以东。
  • 所以从那个谓词中它实际上发现 X 在 Y 的北边而不是实际上在东边?对吗?
  • 不,这还没有定论。除非您指的是不寻常的非球面几何,否则您无法从东或西关系中推断出北或南。如果您只是在谈论东方和西方,而您忽略了一个事实,即 A 可以在 B 的东方或 B 的西方,这取决于您环游地球的哪个方向,那么您可以说如果 A 在 B 的东方,并且B 在 C 的东边,然后 A 在 C 的东边。

标签: recursion prolog


【解决方案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).

【讨论】:

    【解决方案2】:

    我认为您打算使用eastOf(yonge,collegePark) 作为您的第一个声明。现在它永远找不到以 'ave' 或 'yonge' 开头的原子语句,并且一直在 eastOf(X,Y) :- westOf(Y,X)westOf(X,Y) :- eastOf(Y,X) 之间循环。

    【讨论】:

      猜你喜欢
      • 2012-11-13
      • 1970-01-01
      • 1970-01-01
      • 2015-04-04
      • 2023-03-27
      • 1970-01-01
      • 2021-12-15
      • 2016-11-09
      • 2020-08-03
      相关资源
      最近更新 更多