生活随笔
收集整理的這篇文章主要介紹了
NJUPT南邮 | 离散数学_实验一
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
利用真值表法求取主析取范式以及主合取范式
內容:
編程實現用真值表法求取含n個變元的合式公式所對應的主析取范式和主合取范式。
要求:
能夠列出合式公式的真值表并給出相應主析取和主合取范式。
實驗代碼:
import jdk.swing.interop.SwingInterOpUtils;import java.util.*;
import java.util.regex.Pattern;public class Truetable {private static HashMap<Character,Boolean> map
= new HashMap<>();private static List<Character> Alpha = new ArrayList<>();private static int alphaSize
= 0;private static String infixSentence
; private static char[] suffixSentence
= new char[100];private static Boolean res
;private static List<Boolean[]> trueList
= new ArrayList<>(); private static List<Boolean[]> falseList
= new ArrayList<>();public static void main(String[] args
) {init();Scanner scanner
= new Scanner(System.in
);String inputAlpha
;System.out
.println("請輸入命題個數");alphaSize
= scanner
.nextInt();System.out
.println("請輸入合式公式(英文輸入):析取:“|” 合取:“&” 非:“!” 單條件運算符:“->” 雙條件運算:“<>”");do {scanner
.nextLine();inputAlpha
= scanner
.nextLine();scanner
.close();} while (!Pattern.matches("^[A-Za-z-><!|&()]+$", inputAlpha
));StringBuilder sb
= new StringBuilder(inputAlpha
);infixSentence
= standardExpression(inputAlpha
);infixToSuffix(infixSentence
);for (int i
= 0; i
< Alpha.size(); i
++) {System.out
.print(Alpha.get(i
) + "\t");}System.out
.println(inputAlpha
);printTrueTable(0);printAns();}private static void printAns() {disjunctiveForm();conjunctiveForm();}private static void conjunctiveForm() {int i
= 0, j
= 0;int k
;String ans
= "";for (Boolean[] falsearray
: falseList
) {StringBuilder stringBuilder
= new StringBuilder(ans
);stringBuilder
.append("(");for (i
= 0; i
< Alpha.size(); i
++) {if (i
== Alpha.size() - 1) {if (falsearray
[i
]) {stringBuilder
.append("?").append(Alpha.get(i
));} else {stringBuilder
.append(Alpha.get(i
));}} else {if (falsearray
[i
]) {stringBuilder
.append("?").append(Alpha.get(i
)).append("∨");} else {stringBuilder
.append(Alpha.get(i
)).append("∨");}}}stringBuilder
.append(")").append("∧");ans
= stringBuilder
.toString();}try {ans
= ans
.substring(0, ans
.length() - 1);System.out
.print("主合取范式為: ");System.out
.println(ans
);}catch (StringIndexOutOfBoundsException e
){System.out
.println("永真式 T");}}private static void disjunctiveForm() {int i
= 0, j
= 0;int k
;String ans
= "";for (Boolean[] truearray
: trueList
) {StringBuilder stringBuilder
= new StringBuilder(ans
);stringBuilder
.append("(");for (i
= 0; i
< Alpha.size(); i
++) {if (i
== Alpha.size() - 1) {if (truearray
[i
]) {stringBuilder
.append(Alpha.get(i
));} else {stringBuilder
.append("?").append(Alpha.get(i
));}} else {if (truearray
[i
]) {stringBuilder
.append(Alpha.get(i
)).append("∧");} else {stringBuilder
.append("?").append(Alpha.get(i
)).append("∧");}}}stringBuilder
.append(")").append("∨");ans
= stringBuilder
.toString();}try {ans
= ans
.substring(0, ans
.length() - 1);System.out
.print("主析取范式為: ");System.out
.println(ans
);}catch (StringIndexOutOfBoundsException e
){System.out
.println("永假式 F");}}private static void printTrueTable(int cur
) {Boolean[] bs
= new Boolean[alphaSize
];if (cur
== Alpha.size()) {checkCal(); for (Character character
: Alpha) {if (map
.get(character
)) {System.out
.print("T" + "\t");} else {System.out
.print("F" + "\t");}}if (res
) {System.out
.println("T");for (int i
= 0; i
< Alpha.size(); i
++) {bs
[i
] = map
.get(Alpha.get(i
));}trueList
.add(bs
);} else {System.out
.println("F");for (int i
= 0; i
< Alpha.size(); i
++) {bs
[i
] = map
.get(Alpha.get(i
));}falseList
.add(bs
);}return;}map
.put(Alpha.get(cur
), true);printTrueTable(cur
+ 1);map
.put(Alpha.get(cur
), false);printTrueTable(cur
+ 1);}private static void checkCal() {Stack<Boolean> s
= new Stack<>();char ch
;int j
= 0;Boolean b1
, b2
;ch
= suffixSentence
[j
];while (!(ch
== '#') && (ch
!= 0)) {ch
= suffixSentence
[j
++];if (Character.isAlphabetic(ch
)) {s
.push(map
.get(ch
));} else {if (ch
== '!') { b1
= s
.lastElement();s
.pop();s
.push(!b1
);} else if (ch
== '&') { b1
= s
.lastElement();s
.pop();b2
= s
.lastElement();s
.pop();s
.push(b1
&& b2
); } else if (ch
== '|') {b1
= s
.lastElement();s
.pop();b2
= s
.lastElement();s
.pop();s
.push(b1
|| b2
);} else if (ch
== '>') { b2
= s
.lastElement();s
.pop();b1
= s
.lastElement();s
.pop();s
.push(!b1
|| b2
);} else if (ch
== '<') { b1
= s
.lastElement();s
.pop();b2
= s
.lastElement();s
.pop();s
.push((b1
&& b2
) || (!b1
&& !b2
));}}}res
= s
.lastElement();}private static void infixToSuffix(String infixSentence
) {int i
= 0, j
= 0;Stack<Character> s
= new Stack<>();s
.push('#');char ch
, operator
;char[] alphas
= infixSentence
.toCharArray();ch
= alphas
[j
];while (ch
!= '#') {if (Character.isAlphabetic(ch
)) {suffixSentence
[i
++] = ch
;if (!Alpha.contains(ch
)) {Alpha.add(ch
);}} else if (ch
== ')') {for (operator
= s
.lastElement(), s
.pop();operator
!= '(';operator
= s
.lastElement(), s
.pop()) {suffixSentence
[i
++] = operator
;}} else {for (operator
= s
.lastElement(), s
.pop();icp(ch
) <= isp(operator
);operator
= s
.lastElement(), s
.pop()) {suffixSentence
[i
++] = operator
;}s
.push(operator
);s
.push(ch
);}ch
= alphas
[++j
];}while (!s
.isEmpty()) {operator
= s
.lastElement();s
.pop();if (operator
!= '#') {suffixSentence
[i
++] = operator
;}}}private static int isp(char operator
) {if (operator
== '#') return 0;if (operator
== '(') return 1;if (operator
== '!') return 11;if (operator
== '&') return 9;if (operator
== '|') return 7;if (operator
== '>') return 5;if (operator
== '<') return 3;if (operator
== ')') return 12;return 0;}private static int icp(char ch
) {if (ch
== '#') return 0;if (ch
== '(') return 12;if (ch
== '!') return 10;if (ch
== '&') return 8;if (ch
== '|') return 6;if (ch
== '>') return 4;if (ch
== '<') return 2;if (ch
== ')') return 1;return 0;}private static String standardExpression(String Sentence) {Sentence = Sentence.replaceAll("->", ">").replaceAll("<>", "<").replaceAll(" ", "") + "#";return Sentence;}private static void init() {map
.clear();Alpha.clear();}}
總結
以上是生活随笔為你收集整理的NJUPT南邮 | 离散数学_实验一的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。