-2

关于接下来的三个 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 对其进行测试?

谢谢你的期待!

4

2 回答 2

1

我会给你几个提示:

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

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

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

    总和(列表,总和):- 总和(列表,0,总和)。

  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。

于 2012-05-27T12:56:22.767 回答
0

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

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

sum([FirstNum | Rest], Sum) :- sum(Rest, Sum1),Sum 是 FirstNum + Sum1。

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

于 2012-05-27T14:28:06.123 回答