list - Prolog 中列表的串联

标签 list prolog

有人可以帮我找出这些规则中的错误吗?

concat([], List, List).
concat([Head|[]], List, [Head|List]).
concat([Head|Tail], List, Concat) :- concat(Tail, List, C), concat(Head, C, Concat).

尝试连接两个列表失败:
| ?- concat([1,2], [4,7,0], What).

no

最佳答案

要按照您想要的方式修复您的代码,您只需转换 Head进入 [Head]在您最后一次调用 concat/3在你的最后一个条款中。问题是你用 Head 调用你的谓词。仅作为第一个参数,它不是一个列表。

不过,这里有几个注意事项:

  • [Head|[]]相当于[Head]
  • 您的算法的复杂性很差,n!我相信。
  • 在您的第二个子句之后没有插入任何剪切,您可以通过调用您的第三个子句生成无限选择点,列表长度为 1(因此调用您的第二个子句,然后通过您的第三个子句运行,等等......无限循环)。

  • 这是 SWI-pl 的版本,提示您使用良好的序言递归:
    append([], List, List).
    append([Head|Tail], List, [Head|Rest]) :-
        append(Tail, List, Rest).
    

    您可以在此处或 Learn Prolog Now! 中找到有关最近帖子的其他资源如果您想学习如何正确使用递归,请参阅教程。

    关于list - Prolog 中列表的串联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9348640/

    相关文章:

    Prolog简单谓词,如何实现?

    list - Prolog 仅删除唯一元素

    list - 有没有办法只对 Prolog 中包含字母和整数的对列表中的整数求和?

    prolog - 自定义二叉搜索树的逻辑问题

    python - 生成元组列表并使用它

    list - 在 Sharepoint 中,如何使用 REST API 获取在浏览器中打开文档的列表高级设置

    java - 使用ListIterator删除重复项

    c++ - 将函数引用添加到列表

    c++ - 从初始化列表分配给数组

    concurrency - 同时应用谓词来过滤列表 (SWI Prolog)