【问题标题】:Prolog programming - what is the program regarding the next tasks? [closed]Prolog 编程 - 关于下一个任务的程序是什么? [关闭]
【发布时间】:2012-05-26 19:53:16
【问题描述】:

您能帮我了解接下来的三个 Prolog 程序吗?

  1. 列表中元素的汇总,并检查是否与 3 相除? 比如列表是[1, 2, 3] --> 元素的和除以3,因为1+2+3=6, 6/3=2 --> 所以输出应该为真。

  2. 如果 7 在列表中,则将其加倍。 例如:输入列表 --> [1,7,3,7,7],输出应该是 [1,7,7,3,7,7,7,7]。

  3. 如果 7 在列表中,请将其更改为 2,7,2。 例如:输入列表-->[1,7,2,1],输出应该是[1,2,7,2,2,1]

什么是程序以及如何使用 SWI-Prolog 对其进行测试?

谢谢你的期待!

【问题讨论】:

  • 这不是domyhomeworkforme.com。

标签: prolog logic


【解决方案1】:

我会给你一些提示:

  1. 您需要 a) 计算总和,b) 检查它是否除以 3。如果您使用 SWI-Prolog,则库 lists 中有一个谓词 sum_list 执行 a) 和 ... is ... mod ... 构造解决 b) 如果需要使用递归而不是内置谓词来计算总和:

    sum([X|Xs], Acc, Sum) :- Acc1 是 Acc + X, sum(Xs, Acc1, Sum)。

    总和([],累加,累加)。

    sum(List, Sum) :- sum(List, 0, Sum)。

  2. 和 3. 这些是递归过程。您应该遍历列表,如果遇到 7,则应将问题 2 替换为 7,7,问题 3 替换为 2,7,2。

traverse_list([],[]).
traverse_list([7|Xs], [7,7|Ps]) :-
   !,
   traverse_list(Xs,Ps).
traverse_list([X|Xs], [X|Ps]) :-
   traverse_list(Xs,Ps).

考虑为 3 修改这个片段。

【讨论】:

  • 嗨!谢谢你的代码。关于我的 2 和 3 问题:如果我理解得很好,您的代码会等待两个列表(例如:[1,1,7] 和 [1,1,7,7])并且输出是真还是假(在例子是真的)。但是我需要一个代码,输入是[1,1,7],输出是[1,1,7]!所以只需要一个列表,代码创建另一个列表。你能帮帮我吗?
  • Predicate traverse_list 也可以用第二个参数作为变量来调用。成功后,变量将与所有 7 个重复的列表统一。
【解决方案2】:

我建议您考虑一下并自行解决。也就是说,我会给你一些帮助开始的东西:

1) 我假设您的讲师希望看到您进行递归,而不是使用内置的 sum_list 谓词。看起来像这样:

sum([FirstNum | Rest], Sum) :- 总和(休息,总和 1), Sum 是 FirstNum + Sum1。

然后使用“mod”运算符来检查整除性。请记住在递归到达空集 [] 时包含一个基本情况。如果你能理解这一点,其余的应该很容易。祝你好运。

【讨论】:

  • 如果使用递归,使用尾递归更有效(= 递归调用是子句主体中的最后一个子目标)。尾递归实现可以使用累加器完成:sum([X|Xs], Acc, Sum) :- Acc1 is Acc + X, sum(Xs, Acc1, Sum).sum([], Acc, Acc).sum(List, Sum) :- sum(List, 0, Sum).
  • 同意...但对于初学者来说可能不是最简单的概念。计算复杂性与作业问题复杂性:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-25
  • 1970-01-01
  • 1970-01-01
  • 2014-05-16
  • 1970-01-01
相关资源
最近更新 更多