Документ взят из кэша поисковой машины. Адрес оригинального документа : http://www.fds-net.ru/showflat.php?Number=4583573&src=arc&showlite=
Дата изменения: Unknown
Дата индексирования: Tue Apr 12 13:51:00 2016
Кодировка: Windows-1251
Lisp - [преобразование КНФ в правильную КНФ] - Public forum of MSU united student networks
Root | Google | Yandex | Mail.ru | Kommersant | Afisha | LAN Support
  
Technical >> Development (Archive)

Страницы: 0 | 20 | 40 | 60 | 80 | 100 | показать все | след. страница
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++ многие гораздо хуже пишут.

Страницы: 0 | 20 | 40 | 60 | 80 | 100 | показать все | след. страница

Technical >> Development (Archive)

Дополнительная информация
1 зарегистрированных и 1 анонимных пользователей просматривают этот форум.

Модераторы:  DarkGray 

Печать темы
>>
Права
      Вы можете создавать новые темы
      Вы можете отвечать на сообщения
      HTML отключен
      UBBCode включен

Рейтинг:
Просмотров темы:

Переход в