【问题标题】:Dealing with uninstantiated values in Prolog在 Prolog 中处理未实例化的值
【发布时间】:2025-11-23 07:45:01
【问题描述】:

您好,我是 Prolog 的新手, 我在这里有一个谓词,它采用未实例化的 Line 和 Column 值。

Call: (20) project: inside_square(position(_8924, _8926), shape(square, 2)) ? creep

我希望 Prolog 知道并记住正方形维度范围内的每个值(回溯),并使用这些值来解决更大的问题。 我正在使用member/2,但这里的问题是它只取范围的第一个值1,并继续他的回溯(我注意到trace.)。

我不知道我是否足够清楚,当我无法提供完整的上下文但告诉我我是否不够清楚时,这很难做到。

谁能用人类语言向我解释发生了什么。

inside_square(位置(Line,Column), shape(square,Dimension)) :-

 Dimension >= 0,
 findall(List, between(1,Dimension,List), Range),
 member(Column, Range),member(Line, Range),
 shape(square,Dimension).  %this line is not important here

编辑 我已经尝试过这样的事情:

inside_square(position(Line,Column), shape(square,Dimension)) :-
     Dimension >= 0,
     between(1, Dimension, Line),between(1, Dimension, Column),
     shape(square,Dimension).

但我不知道回溯是否会使用所有位置值..

【问题讨论】:

  • 我想你想看看clpfd,因为听起来你实际上是想限制 Line 和 Column 的值,而不是对它们是什么做出具体决定,而这正是 CLPFD是为了。至少,Vanilla Prolog 可能无法为您实现目标。
  • 我必须经历那种痛苦,因为这是一个任务 T_T。
  • 我有尺寸,因为它是一个正方形,尺寸 x 尺寸。 :s,我只需要找到一种方法或理解为什么它只采用列表中的第一种可能性,以及如何让它一个一个地接受它们..
  • 好吧,Prolog 不是逻辑,它必须从某个地方开始,并且将从 1 开始,因为您在 between/3 调用中指定了它。在您的编辑中,如果您想一次实现所有解决方案,您将需要使用像findall/3setof/3bagof/3 这样的二阶谓词,其中每个有有趣的差异。
  • 请显示您的示例电话以及您对此的具体问题。 “我在这里有一个谓词采用未实例化的行和列值”不,你没有。如果我调用inside_square(position(1,2), shape(square,4)),那么它们确实会在输入谓词的实例上被实例化,因为调用谓词是为了匹配查询和谓词的 head (其中谓词被定义为 :- 身体)。

标签: prolog


【解决方案1】:

我发现了我的错误。 我在阻止回溯的更高谓词中使用了剪切!

【讨论】:

    最近更新 更多