【问题标题】:Function that accepts two lists of predicates and elements list and partitions the elements list accordingly接受两个谓词列表和元素列表并相应地对元素列表进行分区的函数
【发布时间】:2022-01-01 03:23:49
【问题描述】:

我想编写一个函数,它接受两个谓词函数列表和元素列表,并返回原始列表中包含 pre1_list 中所有谓词的所有成员,并删除原始列表中不包含 pre2_list 中所有谓词的成员

我正在用一种叫做 mini lisp 的语言编写这段代码,它与 lisp 类似,但更简单,但这没关系,我只是想知道如何做这样的事情?关于如何实现此类代码的想法!

我想怎么做:(只是我想法的开始)

(defun get_pred_1_not_2 (pre1_list pre2_list list)
  (cond
    ((null list) NIL)
      ; return all the members in the original list that hold all the predicates in pre1_list
    (pre1_list (get_pred_1_not_2 (cdr pre1_list) pre2_list (filter_pre list (car pre1_list))))
      ; delete all the members in the original list that unhold all the predicates in pre2_list
    (pre2_list (get_pred_1_not_2 pre1_list (cdr pre2_list) ;.... ( 

其中filter_pre 是一个函数,它返回列表中包含对其的谓词的所有元素

我希望有人可以提供帮助!因为这个函数真的很难写,我不想放弃 谢谢

【问题讨论】:

    标签: lisp common-lisp predicate partition mini-language


    【解决方案1】:

    不要尝试一次性构建整个解决方案。而是继续为自己构建构建块,逐个功能地完成足够简单的任务,以便每个功能都易于编写。这就是“函数式编程”方法。

    从一个谓词的简单filter 函数开始。然后将其修改为您的filter-not

    然后用它们来实现filter-psfilter-not-ps

    或者,通过编写 all-psall-ps-not 函数将您的谓词列表变成一个谓词。

    生成的 predicate 将一次与 一个 元素一起使用,因此您可以将其与简单的 filter 一起使用以获得您想要的内容,只需两次调用filter -- 首先将all-ps 的结果应用于您的第一个谓词列表;第二个,all-ps-not 的结果应用于您的第二个谓词列表。

    编辑:如果您删除所有谓词“未保留”的所有元素,即返回 false,则剩下的所有元素至少有一个谓词返回真。因此,您不妨说,对于任务的第二部分,您希望保留至少有一个谓词适用的所有元素。仍然适用相同的一般准则,只是您需要定义at-least-one-of-ps,或者将其命名为some-ps,而不是定义all-ps-not

    【讨论】:

    • 删除原始列表中所有未持有pre2_list中所有谓词的成员和;保留原始列表中包含 pre1_list 中所有谓词的所有成员
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-06
    • 1970-01-01
    • 1970-01-01
    • 2014-06-09
    • 2019-02-21
    • 1970-01-01
    • 2016-04-11
    相关资源
    最近更新 更多