Functional programming lisp中的析取分布性质
基本上,我需要在下面将这个属性表示为lisp中的函数 (p和q)或(r和t)=(p或r)和(p或t)以及(q或r)和(q或t) 函数distribute or(fbf)将以下类型的公式作为参数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))将其交给(
(或(和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积(换句话说)
- 并形成输出表达式,只需在必要时添加
'或
和'和
这是我正在做的某个项目的一部分。