Pius
|
Don
|
|
|
|
Рег.: 13.05.2006
|
Сообщений: 10
|
|
Рейтинг: 0
|
|
Lisp - [преобразование КНФ в правильную КНФ]
17.05.2006 15:52
|
|
|
народ, помогите написать эту програмку. или может у кого завалялась. поидее для знающих людей должно быть легко. времени сейчас позарез - разбираться некогда. напишите в приват какое вознаграждение вас устроит 
зы ДНФ - правильная, если каждая ее элементарная конъюнкция не содержит повторных вхождений одной переменной.
|
а ведь иногда так хочется ошибаться... |
|
KOHTPA
|
Carpal Tunnel
|
|
|
|
Рег.: 22.01.2003
|
Сообщений: 33647
|
|
Рейтинг: 2374
|
|
Re: Lisp - [преобразование КНФ в правильную КНФ]
[re: Pius]
17.05.2006 15:54
|
|
|
Каково исходное представление данных?
--- ...Я работаю антинаучным аферистом...
|
|
Pius
|
Don
|
|
|
|
Рег.: 13.05.2006
|
Сообщений: 10
|
|
Рейтинг: 0
|
|
Re: Lisp - [преобразование КНФ в правильную КНФ]
[re: KOHTPA]
17.05.2006 15:58
|
|
|
представление исходных данных и вид результирующих данных - на выбор. внутреннее представление обрабатываемых символьных выражений - тоже
("через задницу" наверное не стоит)
|
а ведь иногда так хочется ошибаться... |
|
KOHTPA
|
Carpal Tunnel
|
|
|
|
Рег.: 22.01.2003
|
Сообщений: 33647
|
|
Рейтинг: 2374
|
|
Re: Lisp - [преобразование КНФ в правильную КНФ]
[re: Pius]
17.05.2006 16:01
|
|
|
Могу подсказать, как ваять, либо могу сваять сам, но на Схеме. Могу потом перевести и на Елисп, устанавливать Common не хочу. На выбор.
Есть прямой способ, без оптимизаций и прочих наворотов.
--- ...Я работаю антинаучным аферистом...
|
|
Pius
|
Don
|
|
|
|
Рег.: 13.05.2006
|
Сообщений: 10
|
|
Рейтинг: 0
|
|
Re: Lisp - [преобразование КНФ в правильную КНФ]
[re: KOHTPA]
17.05.2006 16:12
|
|
|
Если сделаешь с комментами будет супер. Елисп подойдет , только расшарь его потом плиз.
|
а ведь иногда так хочется ошибаться... |
|
KOHTPA
|
Carpal Tunnel
|
|
|
|
Рег.: 22.01.2003
|
Сообщений: 33647
|
|
Рейтинг: 2374
|
|
Re: Lisp - [преобразование КНФ в правильную КНФ]
[re: Pius]
17.05.2006 16:43
|
|
|
Через полчаса будет.
--- ...Я работаю...
|
|
KOHTPA
|
Carpal Tunnel
|
|
|
|
Рег.: 22.01.2003
|
Сообщений: 33647
|
|
Рейтинг: 2374
|
|
Re: Lisp - [преобразование КНФ в правильную КНФ]
[re: KOHTPA]
17.05.2006 17:20
|
|
|
code:
(define (uniq lst) (if (null? lst) lst (let ((ulst (uniq (cdr lst)))) (if (member (car lst) ulst) ulst lst))))
(uniq '(a b c d e f)) (uniq '((a a) (b b) (c c))) (uniq '(a a b c a d b c)) (uniq '(a (a a) a (a a) (a a) a))
(define (check-var-i var df) (and (member var df) (member (list 'not var) df)))
(define (check-var var df) (if (and (list? var) (eqv? 'not (car var))) (check-var-i (cadr var) df) (check-var-i var df)))
(display "check-var") (newline)
(check-var 'a '(a b c)) (check-var 'a '((not a) b c)) (check-var 'a '((not a) b a c))
(define (simplify-disj df) (cond ((null? df) df) ((equal? '(#f) (uniq (map check-var df (make-list (length df) df)))) df) (else #t)))
(display "simplify-disj") (newline)
(simplify-disj '(a)) (simplify-disj '(a b c d)) (simplify-disj '((not a) b (not c) d)) (simplify-disj '((not a) b (not c) c d)) (simplify-disj '(a b c a (not c) b a d)) (newline)
(define (filter p l) (if (null? l) l (if (p (car l)) (cons (car l) (filter p (cdr l))) (filter p (cdr l)))))
(lambda (x) (not (eqv? #t x)))
(define (not-#t? x) (not (eqv? #t x)))
(define (simplify-conj cf) (if (member #f cf) #f (let ((pcnf (uniq (map simplify-disj (filter not-#t? cf))))) (if (member #f pcnf) #f (filter not-#t? pcnf)))))
(simplify-conj '((a b c d) (a (not a) b c d) #f (a c d) (a b c d)))
(simplify-conj '((a b c d) (a (not a) b c d) (a c d) (a b c d)))
Scheme R5. Проверялось на Guile:
code:
cat file.scm | guile
Вопросы?
--- ...Я работаю антинаучным аферистом...
|
|
Pius
|
Don
|
|
|
|
Рег.: 13.05.2006
|
Сообщений: 10
|
|
Рейтинг: 0
|
|
Re: Lisp - [преобразование КНФ в правильную КНФ]
[re: KOHTPA]
17.05.2006 17:26
|
|
|
пока ничего не понятно  книжку по лиспу сейчас возьму и буду врубаться
|
а ведь иногда так хочется ошибаться... |
|
KOHTPA
|
Carpal Tunnel
|
|
|
|
Рег.: 22.01.2003
|
Сообщений: 33647
|
|
Рейтинг: 2374
|
|
Re: Lisp - [преобразование КНФ в правильную КНФ]
[re: Pius]
17.05.2006 17:27
|
|
|
Если вопрос стоит так, то книжку надо брать по истинному лиспу --- Схеме.
http://schemers.org/
--- ...Я работаю антинаучным аферистом...
|
|
Pius
|
Don
|
|
|
|
Рег.: 13.05.2006
|
Сообщений: 10
|
|
Рейтинг: 0
|
|
Re: Lisp - [преобразование КНФ в правильную КНФ]
[re: Pius]
17.05.2006 17:28
|
|
|
thx тебе огромный, но ты не мог бы хоть немного комментариев поставить - где там что происходит?
|
а ведь иногда так хочется ошибаться... |
|
Pius
|
Don
|
|
|
|
Рег.: 13.05.2006
|
Сообщений: 10
|
|
Рейтинг: 0
|
|
Re: Lisp - [преобразование КНФ в правильную КНФ]
[re: KOHTPA]
17.05.2006 17:29
|
|
|
брб... lisp <> scheme?
\\ и инета сейчас нет, чтоб почитать тот сайт
Редактировал Pius (17.05.2006 17:33)
|
а ведь иногда так хочется ошибаться... |
|
KOHTPA
|
Carpal Tunnel
|
|
|
|
Рег.: 22.01.2003
|
Сообщений: 33647
|
|
Рейтинг: 2374
|
|
Re: Lisp - [преобразование КНФ в правильную КНФ]
[re: KOHTPA]
17.05.2006 17:41
|
|
|
code:
;; -*- coding: cyrillic-alternativnyj; -*- ; $Id: knf.scm,v 1.2 2006/05/17 13:39:48 user Exp $
; Нам понадобится работать со списком, как с множеством, ; то есть, надо исключать повторные вхождения. (define (uniq lst) (if (null? lst) lst (let ((ulst (uniq (cdr lst)))) (if (member (car lst) ulst) ulst lst))))
; Проверка: (uniq '(a b c d e f)) (uniq '((a a) (b b) (c c))) (uniq '(a a b c a d b c)) (uniq '(a (a a) a (a a) (a a) a))
; Проверяем вхождение переменной и ее отрицания в дизъюнктивную форму. (define (check-var-i var df) (and (member var df) (member (list 'not var) df)))
; Поскольку переменная может встретиться в виде отрицания, ; возможно, потребуется снять объемлющее "not" (define (check-var var df) (if (and (list? var) (eqv? 'not (car var))) (check-var-i (cadr var) df) (check-var-i var df)))
; Проверка: (check-var 'a '(a b c)) (check-var 'a '((not a) b c)) (check-var 'a '((not a) b a c)) (check-var '(not a) '((not a) b a c))
; Упрощение ДФ: исключение повторов, проверка на то, ; что она не сводится к тождественной. (define (simplify-disj df) (cond ((null? df) df) ((equal? '(#f) (uniq (map check-var df (make-list (length df) df)))) df) (else #t)))
(begin (display "Testing simplify-disj") (newline))
(simplify-disj '(a)) (simplify-disj '(a b c d)) (simplify-disj '((not a) b (not c) d)) (simplify-disj '((not a) b (not c) c d)) (simplify-disj '(a b c a (not c) b a d)) (newline)
; Выборка членов списка, удовлетворяющих условию p. (define (filter p l) (if (null? l) l (if (p (car l)) (cons (car l) (filter p (cdr l))) (filter p (cdr l)))))
(define (not-#t? x) (not (eqv? #t x)))
; Упрощение конъюнктивной формы: ; отсечение тождественно ложных и тождественно истинных членов, ; упрощение входящих дизъюнктивных форм, устранение повторов. (define (simplify-conj cf) (if (member #f cf) #f (let ((pcnf (uniq (map simplify-disj (filter not-#t? cf))))) (if (member #f pcnf) #f (filter not-#t? pcnf)))))
; Проверка (simplify-conj '((a b c d) (a (not a) b c d) #f (a c d) (a b c d)))
(simplify-conj '((a b c d) (a (not a) b c d) (a c d) (a b c d)))
--- ...Я работаю...
|
|
KOHTPA
|
Carpal Tunnel
|
|
|
|
Рег.: 22.01.2003
|
Сообщений: 33647
|
|
Рейтинг: 2374
|
|
Re: Lisp - [преобразование КНФ в правильную КНФ]
[re: Pius]
17.05.2006 17:43
|
|
|
Scheme <- T = True Lisp
Тут все слова понятны, а на каком диалекте шепчешь ты, я не знаю, да и ты сам --- не сказал.
--- ...Я работаю антинаучным аферистом...
|
|
Grue
|
Praise Lord Smooze
|
|
|
|
Рег.: 12.09.2005
|
Сообщений: 2977
|
Из: Юго Западная
|
Рейтинг: 869
|
|
Re: Lisp - [преобразование КНФ в правильную КНФ]
[re: Pius]
17.05.2006 18:20
|
|
|
Я бы написал (на Common Lisp), но я не знаю что такое КНФ
|
BOUNCING BABY BUNNIES BURNING BRIGHT |
|
KOHTPA
|
Carpal Tunnel
|
|
|
|
Рег.: 22.01.2003
|
Сообщений: 33647
|
|
Рейтинг: 2374
|
|
Re: Lisp - [преобразование КНФ в правильную КНФ]
[re: KOHTPA]
17.05.2006 18:20
|
|
|
code:
;; -*- coding: cyrillic-alternativnyj; -*- ; $Id: knf.el,v 1.3 2006/05/17 14:18:22 user Exp $
; Нам понадобится работать со списком, как с множеством, ; то есть, надо исключать повторные вхождения. (defun uniq (lst) (if (null lst) lst (let ((ulst (uniq (cdr lst)))) (if (member (car lst) ulst) ulst lst))))
; Проверка: (uniq '(a b c d e f)) (uniq '((a a) (b b) (c c))) (uniq '(a a b c a d b c)) (uniq '(a (a a) a (a a) (a a) a))
; Проверяем вхождение переменной и ее отрицания в дизъюнктивную форму. (defun check-var-i (var df) (and (member var df) (member (list 'not var) df)))
; Поскольку переменная может встретиться в виде отрицания, ; возможно, потребуется снять объемлющее "not" (defun check-var (var df) (if (and (listp var) (eq 'not (car var))) (check-var-i (cadr var) df) (check-var-i var df)))
; Проверка: (check-var 'a '(a b c)) (check-var 'a '((not a) b c)) (check-var 'a '((not a) b a c)) (check-var '(not a) '((not a) b a c))
(defun maplist (f l) (if (null l) l (cons (apply f (list (car l))) (maplist f (cdr l))))) (defun mapl (f l) (if (member nil l) nil (cons (apply f (maplist 'car l)) (mapl f (maplist 'cdr l))))) (defun map (f &all l) (mapl f l))
; Упрощение ДФ: исключение повторов, проверка на то, ; что она не сводится к тождественной. (defun simplify-disj (df) (cond ((null df) df) ((equal '(nil) (uniq (mapl 'check-var (list df (make-list (length df) df))))) df) (t t)))
(simplify-disj '(a)) (simplify-disj '(a b c d)) (simplify-disj '((not a) b (not c) d)) (simplify-disj '((not a) b (not c) c d)) (simplify-disj '(a b c a (not c) b a d)) (newline)
; Выборка членов списка, удовлетворяющих условию p. (defun filter (p l) (if (null l) l (if (apply p (list (car l))) (cons (car l) (filter p (cdr l))) (filter p (cdr l)))))
(defun not-t (x) (not (eq t x)))
; Упрощение конъюнктивной формы: ; отсечение тождественно ложных и тождественно истинных членов, ; упрощение входящих дизъюнктивных форм, устранение повторов. (defun simplify-conj (cf) (if (member nil cf) nil (let ((pcnf (uniq (mapl 'simplify-disj (list (filter 'not-t cf)))))) (if (member nil pcnf) nil (filter 'not-t pcnf)))))
; Проверка (simplify-conj '((a b c d) (a (not a) b c d) nil (a c d) (a b c d)))
(simplify-conj '((a b c d) (a (not a) b c d) (a c d) (a b c d)))
--- INSTITUTE's Name Shows That It's Totally Unrelated To Emacs.
|
|
Pius
|
Don
|
|
|
|
Рег.: 13.05.2006
|
Сообщений: 10
|
|
Рейтинг: 0
|
|
Re: Lisp - [преобразование КНФ в правильную КНФ]
[re: KOHTPA]
17.05.2006 18:25
|
|
|
muchas gracias
|
а ведь иногда так хочется ошибаться... |
|
KOHTPA
|
Carpal Tunnel
|
|
|
|
Рег.: 22.01.2003
|
Сообщений: 33647
|
|
Рейтинг: 2374
|
|
Re: Lisp - [преобразование КНФ в правильную КНФ]
[re: KOHTPA]
17.05.2006 21:54
|
|
|
Исправления.
code:
=================================================================== RCS file: RCS/knf.scm,v retrieving revision 1.2 diff -u -r1.2 knf.scm --- knf.scm 2006/05/17 13:39:48 1.2 +++ knf.scm 2006/05/17 17:48:09 @@ -1,5 +1,5 @@ ;; -*- coding: cyrillic-alternativnyj; -*- -; $Id: knf.scm,v 1.2 2006/05/17 13:39:48 user Exp $ +; $Id: knf.scm,v 1.4 2006/05/17 17:46:17 user Exp $ ; Нам понадобится работать со списком, как с множеством, ; то есть, надо исключать повторные вхождения. @@ -31,15 +31,17 @@ (check-var 'a '((not a) b a c)) (check-var '(not a) '((not a) b a c)) +; Проверка на то, что все члены списка равны заданному. +(define (all? el lst) (equal? (list el) (uniq lst))) + ; Упрощение ДФ: исключение повторов, проверка на то, ; что она не сводится к тождественной. (define (simplify-disj df) - (cond ((null? df) df) - ((equal? '(#f) - (uniq (map check-var df - (make-list (length df) df)))) - df) - (else #t))) + (cond + ((all? #f df) #f) +; ((member #t df) #t) + ((all? #f (map check-var df (make-list (length df) df))) df) + (else #t))) (begin (display "Testing simplify-disj") (newline)) @@ -48,14 +50,14 @@ (simplify-disj '((not a) b (not c) d)) (simplify-disj '((not a) b (not c) c d)) (simplify-disj '(a b c a (not c) b a d)) +(simplify-disj '(#f #f #f)) (newline) ; Выборка членов списка, удовлетворяющих условию p. (define (filter p l) - (if (null? l) l - (if (p (car l)) - (cons (car l) (filter p (cdr l))) - (filter p (cdr l))))) + (cond ((null? l) l) + ((p (car l)) (cons (car l) (filter p (cdr l)))) + (else (filter p (cdr l))))) (define (not-#t? x) (not (eqv? #t x))) @@ -82,3 +84,11 @@ (a (not a) b c d) (a c d) (a b c d))) + +(simplify-conj + '((a b c d) + (a (not a) b c d) + (a c d) + (#f #f) + (a c d c) + (a b c d)))
--- "Потому что Аллах не ведет людей неверных."
|
|
JUnit
|
|
|
|
|
Рег.: 08.03.2005
|
Сообщений: 3812
|
Из: Беляево
|
Рейтинг: 1621
|
|
Re: Lisp - [преобразование КНФ в правильную КНФ]
[re: KOHTPA]
18.05.2006 22:15
|
|
|
КОНТРА выдал код. Что, что, черт возьми, случилось?!! Он что, жениться собрался? 
Ну теперь-то я знаю, как выглядит удобный, читабельный и интуитивно-очевидный код, которого так не хватает всем этим ламерским ООП-языкам. 
|
|
KOHTPA
|
Carpal Tunnel
|
|
|
|
Рег.: 22.01.2003
|
Сообщений: 33647
|
|
Рейтинг: 2374
|
|
Re: Lisp - [преобразование КНФ в правильную КНФ]
[re: Grue]
19.05.2006 10:15
|
|
|
Схема --- это полноценный истинный Лисп. Емакс-лисп --- это полноценный Лисп. Да, в Емакс-лиспе, в силу его особенностей, нет map. В какой библиотеке находится filter, я не помню, а потому просто доопределил. Точно так же я не заморачивался и с другими вещами, поскольку было требование побыстрее, а не попроще и получше.
Вот когда стандарт Common LISP будет помещаться на 50 страницах, тогда вернемся к обсуждению его достоинств, а покуда это не так, Common LISP будет похуже фортрана, поскольку последний превосходит Common LISP как по простоте, так и по функциональности стандартного кода.
Мало того, кто-кто, а ты вообще молчал бы, что-то от тебя решения не увидели --- в кусты спрятался.
--- ...Я работаю антинаучным аферистом...
|
|
Alex
|
veteran
|
|
|
|
Рег.: 16.10.2002
|
Сообщений: 1940
|
Из: ЮЗАО
|
Рейтинг: 18
|
|
Re: Lisp - [преобразование КНФ в правильную КНФ]
[re: JUnit]
19.05.2006 10:33
|
|
|
Quote:
Ну теперь-то я знаю, как выглядит удобный, читабельный и интуитивно-очевидный код, которого так не хватает всем этим ламерским ООП-языкам 
Чего смешного то? Вполне понятный и легко читаемый код. На C++ многие гораздо хуже пишут.
|
|