【问题标题】:Append lists prolog追加列表序言
【发布时间】:2014-10-23 16:05:16
【问题描述】:

给定列表作为输入(下面提到的格式),我需要得到一个简单列表的输出,如果给定的输入列表是空的,那么谓词应该返回一个空列表,

给定输入

[[[a,b],[c]],[[d,e]],[[g,h],[j,k]],[[h,k,l,l]]]

我需要得到输出

[[a,b],[c],[d,e],[g,h],[j,k],[h,k,l,l]]

我在执行递归时遇到问题,

我试过的代码如下,

function([],X):-append([],X,X).
function([Head|Tail],X):-
                first(Tail,A),
                append(Head,A,X),
                removehead(Tail,C),
                function(C,X).

谓词首先返回列表的第一个元素,removehead 删除列表的第一个元素。

【问题讨论】:

  • 给定列表作为输入(以上述格式),我需要得到一个简单列表的输出,如果给定的输入列表为空,则谓词应该返回一个空列表.
  • 把这个放在问题里!

标签: list prolog


【解决方案1】:

您在共享的代码中做出了公平的尝试。以下是您需要改进的地方:

  1. 谓词名称fucntion 描述了这样一个事实:只要第一个参数是列表,该谓词就有一个解决方案。这通常在文档中完成,例如%! function(+Nested:list, -Denested:list) is det.
  2. 如果X 是一个列表,则append([], X, X) 的定义为真,所以这里是多余的。
  3. 什么是first/2removehead/2?如果要实例化到列表的第一个元素,还可以将子句头参数写为[Head,A|C]。那么你也不需要显式地从Tail 中删除头部。

一旦我根据上面的内容进行更改,我就会想出以下代码:

%! denest(+Nested:list, -Denested:list) is det.

denest([], []).
denest([H|T1], L):-
  denest(T1, T2),
  append(H, T2, L).

示例运行:

?- denest([[[a,b],[c]],[[d,e]],[[g,h],[j,k]],[[h,k,l,l]]], L).
   L = [[a, b], [c], [d, e], [g, h], [j, k], [h, k, l|...]].

希望这会有所帮助!

【讨论】:

  • 感谢您的输入,我不知道您提到的编写 head 参数的方式,这促使我编写 first/2 和 removehead/2 。
  • @sand Prolog 是一种非常优雅的语言:你用它编程的时间越长,你的程序就会变得越短:-)
猜你喜欢
  • 2016-08-11
  • 1970-01-01
  • 2020-09-24
  • 2012-08-30
  • 1970-01-01
  • 2012-05-29
  • 1970-01-01
  • 1970-01-01
  • 2017-12-15
相关资源
最近更新 更多