【问题标题】:Get all elements of the list which are less than particular number获取列表中小于特定数字的所有元素
【发布时间】:2019-07-25 00:15:42
【问题描述】:

当我学习 Prolog 时,我遇到了一个问题。我正在尝试制作这样的功能

   ?- less_than([1,2,3,2,1,5],3,Y).
      Y= [1,2,2,1]

因为我正在学习面向对象的编程,所以我对此堆积如山,无法弄清楚如何解决。 这是我的代码:

  less_than([],X,Y).
  less_than([H|T], X, [H1|T1]) :-
            H<X, less_than(T,X,H).

而且,我尝试使用 findall:

  less_than([],X,Y).
  less_than([H|T],X,[H1|T1]) :-
            findall(H, (H<X, less_than(T,X,Y)), Z).

我得到这个结果的地方:

Y = [_G2274|_G2275]  for ?- less_than([1,2,3,4,5],3,X)

我知道它们是未知值,但如何在该列表中设置值?我尝试用和 H 更改 Y,但它不起作用。

我尝试调试它但没有成功,它不断崩溃,这只是如何为我解决它的合乎逻辑的解释。 Any1 有什么想法吗?

【问题讨论】:

标签: prolog


【解决方案1】:

我不会为你解决整个问题,但我想向你展示如何处理这些问题。

Prolog 的一个主要优点是您可以以声明方式 调试问题。这意味着您使用 Prolog 的 逻辑属性 来定位意外答案的原因。

例如,在您的情况下,您有程序:

小于([],X,Y)。 小于([H|T],X,[H1|T1]):- H

以及以下意外的失败查询:

?- less_than([1,2,3,2,1,5], 3, Y)。 错误

让我们使用以下定义来概括 Prolog 程序,就像在 GUPU 中一样:

:- op(950,fy, *).

*_.

例如,考虑以下概括,我们通过将(*)/1 放在所有目标前面来获得:

小于([],X,Y)。 小于([H|T],X,[H1|T1]):- * H , * less_than(T, X, H)

通过这种概括,我们有:

?- less_than([1,2,3,2,1,5],3,Y)。 Y = [_G946|_G947]

所以,虽然现在这太笼统了,但至少查询成功

通过提炼概括,我们可以缩小问题的确切原因。例如:

小于([],X,Y)。 小于([H|T],X,[H1|T1]):- * H , 小于(T,X,H)。

这又产生了:

?- less_than([1,2,3,2,1,5],3,Y)。 错误

请注意,添加更多目标最多可以专门化程序,而不是泛化它。因此,如果我们希望这个查询成功,就必须对 remaining 片段进行泛化。

因此,如果您希望您的查询完全成功,您必须至少使以下片段成功用于查询:

小于([],X,Y)。 小于([H|T],X,[H1|T1]):- 小于(T,X,H)。

为什么目前失败了?尝试以下进一步概括

小于([],/*X*/_,/*Y*/_)。 小于([H|T], /*X*/_, [/*H1*/_|/*T1*/_ ]) :- 小于(T,/*X*/_,H)。

仍然失败

?- less_than([1,2,3,2,1,5],3,Y)。 错误

所以,我们现在简化为:

少于([], _, _)。 小于([H|T],_,[_|_]):- 小于(T,_,H)。

现在重点是:有趣的是,以下概括成功

少于([], _, _)。 小于([H|T],_,[_|_]):- 小于(T,_,/*H*/_)。

因此,less_than/3 调用的最后一个参数是需要仔细审查的热门候选...

【讨论】:

  • 我做了一些更改,我认为该程序现在正在运行。 less_than([],X,[]). less_than([H|T], X, [H|List]) :- H&lt;X, less_than(T, X, List). less_than([H|T], X, List) :- H&gt;=X, less_than(T,X, List). 实际上,除了最后一个 less_than(T, X, List). 之外,我都写下了。这是为什么?我发现我需要一些可以遍历所有列表的东西,但我不知道如何不将这些数字 H&gt;=X 添加到我的最后一个参数中。所以我现在的问题是,最后一行与 less_than/3 有何不同?我只是想不通,你能帮我解释一下吗?
  • 最后一行less_than/3形式的目标。理解该定义的一个好方法是以声明方式阅读子句:If H &gt;= X and ListTs 的元素列表 小于 X, 然后 List 也是 小于的元素列表X 在列表[H|Ts] 中。与其他两个子句类似,例如: [] 是小于X 的元素列表,这些元素也出现在空列表中。使用约束会让你的程序更通用,也可以在其他方向使用!
猜你喜欢
  • 1970-01-01
  • 2016-01-03
  • 2016-05-11
  • 2017-03-01
  • 2014-02-13
  • 1970-01-01
  • 1970-01-01
  • 2015-09-09
  • 1970-01-01
相关资源
最近更新 更多