Functional programming lisp中的析取分布性质

Functional programming lisp中的析取分布性质,functional-programming,lisp,Functional Programming,Lisp,基本上,我需要在下面将这个属性表示为lisp中的函数 (p和q)或(r和t)=(p或r)和(p或t)以及(q或r)和(q或t) 函数distribute or(fbf)将以下类型的公式作为参数 (或(和a b)c)并将其转换为(和(或a c)(或b c)) 但是,问题是您不知道or公式可以有多少个参数,哪些是删除项,哪些是删除项的连接项。 它可以是以下任一示例 (或a b)保持原样 (或abc(和def)应该变成(和(或abcd)(或abce)(或abcf) (或(和ab)(和de))将其交给(

基本上,我需要在下面将这个属性表示为lisp中的函数

(p和q)或(r和t)=(p或r)和(p或t)以及(q或r)和(q或t)

函数distribute or(fbf)将以下类型的公式作为参数

(或(和a b)c)
并将其转换为
(和(或a c)(或b c))

但是,问题是您不知道or公式可以有多少个参数,哪些是删除项,哪些是删除项的连接项。 它可以是以下任一示例

(或a b)
保持原样

(或abc(和def)
应该变成
(和(或abcd)(或abce)(或abcf)
(或(和ab)(和de))
将其交给
(和(或ad)(或ae)(或bd)(或be))


只有当“or”有两个参数时,我才能设计一个函数,但是如果它有更多的参数,我不知道怎么做。

所以,你已经有了一个函数
f
,它可以将
((ab)(cd))
转换成
((ac)(ad)(bc)(bd))
(我省略
s)

你需要一个能将
((ab)(cd)(ef))
转换成
((ace)(acf)(ade)(adf)(bce)(bcf)(bde)(bdf))


这似乎是一个明显的例子:
(reduce#f mylist)

由于您没有编写您的
分发或
,因此我建议使用此变体,它使用任何长度的fbf,但不深入工作

(defun dekart-product (sets)
  (if (null sets)
      (list '())
      (let ((prod (dekart-product (cdr sets))))
        (mapcan #'(lambda (lst) 
                    (mapcar #'(lambda (el) (cons el lst))
                            (car sets)))
                prod))))

(defun collect-ands (l)
  (mapcar #'(lambda (el)
              (if (and (consp el)
                       (eq 'and (car el)))
                  (cdr el)
                  (list el)))
          l))

(defun distribute-or (fbf)
  (if (and (consp fbf)
           (eq 'or (car fbf)))
      (cons 'and (mapcar #'(lambda (lst) (cons 'or lst))
                         (dekart-product
                                (collect-ands (cdr fbf)))))
      fbf))
结果是:

(distribute-or '(or a b c (and d e f)))
;=> (AND (OR A B C D) (OR A B C E) (OR A B C F))
它的工作方式很简单:

  • 将和表达式的所有参数收集到集合中:
    (或(和abc)(和ef)g)
    -->
    ((abc)(ef)(g))
  • 然后对所有收集的数据集进行dekart积(换句话说)
  • 并形成输出表达式,只需在必要时添加
    '或
    '和

这是我正在做的某个项目的一部分。