Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 方案:从嵌套列表中删除元素_List_Scheme - Fatal编程技术网

List 方案:从嵌套列表中删除元素

List 方案:从嵌套列表中删除元素,list,scheme,List,Scheme,给出一个命题公式,i。e((a和(b表示c)或(d和(e表示f))), 我需要编写一个Scheme函数来删除连接词,和,意味着,或。 函数的返回包含公式中的所有变量。例如, (a b c d e f) 我甚至不知道该如何开始,因为我不确定如何进入嵌套列表并删除和cons某些变量和连接词。我将从以下内容开始: (define somelist (list 'a 'and (list 'b 'implies 'c) 'or (list 'd 'and (list 'e 'imp

给出一个命题公式,i。e<代码>((a和(b表示c)或(d和(e表示f))), 我需要编写一个Scheme函数来删除连接词,
意味着
。 函数的返回包含公式中的所有变量。例如,
(a b c d e f)


我甚至不知道该如何开始,因为我不确定如何进入嵌套列表并删除和
cons
某些变量和连接词。

我将从以下内容开始:

(define somelist
  (list 'a 'and (list 'b 'implies 'c) 
        'or (list 'd 'and (list 'e 'implies 'f))))

(define (remove-vars xs ys)
  (let ((xs-f (flatten xs)))
    (filter-two xs-f ys)))

(define (filter-two xs ys)
  (foldr (lambda(y acc)
           (filter (lambda(x) (not (eq? x y))) acc))
         xs
         ys))
测试:

更新:好的,@karategeek6报告说,他的方案解释器中没有
flatten
filter
,我不确定您是否有,所以让我们手动实现它们,因为R^6RS中也没有
filter
flatten

(define (my-flatten xs)
  (foldr
   (lambda(x acc)
     (if (list? x)
         (append (my-flatten x) acc)
         (cons x acc)))
   (list)
   xs))

(define (my-filter pred xs)
  (let recur ((xs xs)
              (acc (list)))
    (if (empty? xs)
        (reverse acc)
        (if (pred (car xs))
            (recur (cdr xs) (cons (car xs) acc))
            (recur (cdr xs) acc)))))
适当修改
删除变量
过滤两个变量

(define (remove-vars xs ys)
  (let ((xs-f (my-flatten xs)))
    (filter-two xs-f ys)))

(define (filter-two xs ys)
  (foldr (lambda(y acc)
           (my-filter (lambda(x) (not (eq? x y))) acc))
         xs
         ys))

您应该获得与上述过程的早期版本相同的输出。

删除一个、两个或所有连接词后,您的公式会是什么样子?你能举个例子吗?过滤和展平是从哪里来的?它们是R6R的新产品吗?我目前只熟悉R5R,我知道它们不在该标准中。过滤器来自srfi-1,扁平化。。。我不知道。我也会用折叠实现过滤器。
(define (remove-vars xs ys)
  (let ((xs-f (my-flatten xs)))
    (filter-two xs-f ys)))

(define (filter-two xs ys)
  (foldr (lambda(y acc)
           (my-filter (lambda(x) (not (eq? x y))) acc))
         xs
         ys))