【问题标题】:Appending list to character将列表附加到字符
【发布时间】:2017-12-05 04:58:21
【问题描述】:

我试图以递归方式将列表的头部附加到原子,但是 prolog 不断返回 false,我无法确定原因。

我的原始代码:

listpicket(K, [H1|T1], L) :-
    append([K], [H1], L),
    listpicket(K, T1, L).

运行方式:

?- listpicket(k, [a,b,c], L).

预期输出:

[k, a, k, b, k, c].

实际输出:

false.

怀疑 false 来自最后一次递归迭代,没有尾部(T1,此处),我尝试像这样处理这种情况:

listpicket(K, [H1|T1], L) :-
    (
        not(is_list(T1)),
        [K|T1]
    );
    append([K], [H1], L),
    listpicket(K, T1, L).

但我也得到false 作为结果。

我做错了什么?

【问题讨论】:

  • append 表示添加在末尾而不是开头。
  • @LuaiGhunim 我知道,这就是为什么我将头部附加到我的原子上。这样我就得到了[k, a, k, b, ...]。因此,尝试将列表的头部附加到我的变量 K 到一个新列表 L 中,并通过将列表的尾部传递给递归调用来递归地重复(获取该新列表的头部等)。
  • 你得到 false 因为你没有基本情况,而且你第二次调用 append 它会失败

标签: prolog


【解决方案1】:

失败是因为当您第二次调用append/3 时,您必须有一个未实例化的变量,但当时 L 是未实例化的。

append/3 说给我两个列表和一个变量/未实例化,我将返回串联列表。

你可以像这样调整你的代码:

`

listpicket(K, [H1|T1], [NewL|L]) :-
   append([K], [H1], NewL),
   listpicket(K, T1, L).`

和基本情况:

listpicket(_,[],[]).

此代码将起作用,但您仍然不会得到预期的结果,因为您是在列表中创建的列表。每次append/3 返回一个列表,我们将其添加为列表的头部。

好吧,我会这样解决:

listpicket(_,[],[]).
listpicket(K,[H|T],[K,H|L]):-
  listpicket(K,T,L).

【讨论】:

  • 我确实有一个基本情况,实际上,就像listpicket(K, [], K).,但不会像你写的那样工作。我什至没有想到在参数列表中“附加”!我有很多序言要研究...:/
  • 我需要 15 个代表来支持你,否则我会的。对不起!
  • lol np ,Prolog 很有趣 :) 我想说一开始你应该使用图形跟踪器。去prolog然后输入guitracer.然后输入trace然后执行你的查询,你可以一步一步来
  • 谢谢!我稍微使用了swish.swi-prolog.org 和他们的调试器,但我习惯了在每一步都可以看到变量内容的语言。 Prolog 是一种不同的思维方式 - 我将尝试 swi-prolog 安装版本的 guitracer。
  • 哦,是的,guitracer 好多了!感谢您的提示!
猜你喜欢
  • 2012-12-05
  • 2012-09-14
  • 2018-09-13
  • 2016-07-03
  • 2012-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多