Привет!
У меня интересная курсовая, думаю, есть что обсудить. На самом деле, пишу с целью именно поразмышлять, а не получить помощь.
Необходимо избавиться от
внешнего квантора существования в формулах вида
![$ \exists x (a_0\cdot x=b_o \wedge a_1\cdot x=b_1 \equiv \exists y (c\cdot x + b_1 \cdot y = e)) $ $ \exists x (a_0\cdot x=b_o \wedge a_1\cdot x=b_1 \equiv \exists y (c\cdot x + b_1 \cdot y = e)) $](https://dxdy-02.korotkov.co.uk/f/5/a/2/5a2433fdbe99793bd24949c06c76f59682.png)
В качестве условий могут быть только
линейные уравнения
Например, для формулы
![$ \exists x (a\cdot x=b)$ $ \exists x (a\cdot x=b)$](https://dxdy-03.korotkov.co.uk/f/e/3/8/e3803965e8ab5cd8e4cb1ace311c53dd82.png)
программа должна выводить
![$ (a=0 \wedge b=0)\vee(a\neq 0) $ $ (a=0 \wedge b=0)\vee(a\neq 0) $](https://dxdy-01.korotkov.co.uk/f/8/a/c/8aca2025ec2ed0639f6a1524ee891f1282.png)
Более сложная:
![$ \exists x (a_0\cdot x=b_0 \wedge a_1\cdot x=b_1) $ $ \exists x (a_0\cdot x=b_0 \wedge a_1\cdot x=b_1) $](https://dxdy-02.korotkov.co.uk/f/5/7/c/57c90f9220506816abff49fbaefbb29982.png)
![$(a_0=0 \wedge b_0=0 \wedge a_1=0 \wedge b_1 = 0) \vee (a_0=0 \wedge b_0 = 0 \wedge a_1 \neq 0) \vee (a_0 \neq 0 \wedge a_1=0 \wedge b_1=0) \vee (a_0 \neq 0 \wedge a_1\cdot \frac{b_0}{a_0} = b_1)$ $(a_0=0 \wedge b_0=0 \wedge a_1=0 \wedge b_1 = 0) \vee (a_0=0 \wedge b_0 = 0 \wedge a_1 \neq 0) \vee (a_0 \neq 0 \wedge a_1=0 \wedge b_1=0) \vee (a_0 \neq 0 \wedge a_1\cdot \frac{b_0}{a_0} = b_1)$](https://dxdy-02.korotkov.co.uk/f/9/2/e/92e0439dc7878203a93d49a29f52419082.png)
Если необходимо, могу привести еще несколько примеров. Понятно, что для больших формул на выходе будут получатся страшнейшие
ДНФ.
Выполнить программу необходимо на одном из диалектов Пролога.
Здесь предлагаю обсуждать алгоритм в целом, не зацикливаясь на конкретных технических средствах. С другой стороны, пролог - мощное средство для решения такого рода задач, так что целиком абстрагироваться не получится.
Мои размышления:
Необходимо хранить некую базу знаний про переменные и константы, уметь объединять базы знаний (or, and), уметь
умно добавлять значения в базу. Например: в БЗ хранится информация, что
![$a=0$ $a=0$](https://dxdy-02.korotkov.co.uk/f/d/7/3/d7390019e5f9d9dcee82a92b3e0a537582.png)
. Тогда, при попытке добавить факт
![$a \neq 0$ $a \neq 0$](https://dxdy-04.korotkov.co.uk/f/b/d/4/bd463b12b5b7b37c46fb25f0402ad61782.png)
, эта ветка должна обрываться. Еще, видимо, надо постоянно поддерживать ДНФ.
Необходимо обрабатывать такие ситуации:
БЗ:
![$ a=0,a=b $ $ a=0,a=b $](https://dxdy-03.korotkov.co.uk/f/2/5/4/2544d42179c1e529cf521b579200681e82.png)
при добавлении
![$b \neq 0$ $b \neq 0$](https://dxdy-01.korotkov.co.uk/f/c/8/2/c823bb4ab2f6d1291908d17be9602a3782.png)
, ветка должна обрываться. Как это делать не совсем понятно, первое что приходит в голову - при добавлении
![$ a=b$ $ a=b$](https://dxdy-04.korotkov.co.uk/f/f/c/6/fc69034b13e8b9d91b2fb47c17781d3682.png)
просматривать уже известные факты про а и дописывать избыточное условие
![$b \neq 0$ $b \neq 0$](https://dxdy-01.korotkov.co.uk/f/c/8/2/c823bb4ab2f6d1291908d17be9602a3782.png)
. Но это едва ли хороший тон.
Для начала предлагаю обсудить алгоритм работы описанного аппарата БЗ, или предложить что-нибудь взамен.
Кто-нибудь сталкивался с подобными задачами? Есть какие-нибудь классические алгоритмы?
Заранее спасибо, надеюсь на конструктивный диалог.
-- Сб апр 09, 2011 12:40:36 --![$(\frac {a}{b}=\frac {c}{d} \wedge a=b )\Rightarrow c=d$ $(\frac {a}{b}=\frac {c}{d} \wedge a=b )\Rightarrow c=d$](https://dxdy-03.korotkov.co.uk/f/a/d/1/ad11da525b6fa65fbe2e5f61b3f0bbf382.png)
Это, очевидно, программа тоже должна уметь делать...