У меня есть небольшая проблема в цикле, которая усваивает условие на сгенерированной таблице истинности. Таким образом, вы вводите логическое выражение, а затем превращаете его в таблицу истинности, он также интерпретирует, является ли он действительным или недействительным или непоследовательным. Пока это часть программы, которая интерпретирует ее, но она только ломается недействительной или действительной ... можете ли вы, пожалуйста, направить меня на это? БлагодаряПрограмма CLISP для определения таблицы истинности является непоследовательной, действительной или недействительной
* редактировать // Так что это, как программа работает:
******* Добро пожаловать ********
Тип (LogicStart) в начать или (выйти), чтобы выйти в любое время.
;; Загруженный файл MyLogic.lisp
T [2]> (LogicStart) Введите логическое выражение или формулу: "(р^(~ р))"
р (~ р) (р^(р ~))
Т NIL NIL
NIL NIL Т
формула Недопустимый
Таким образом, вход только логическое выражение, то выходной сигнал представляет собой таблицу истинности для этого выражения .... и может als о его интерпретировать, но мой код имеет только два intepretations: недействительная или действительная (тавтология), так как в приведенном выше примере должно быть непоследовательными/невыполнимо (поскольку все интерпретации формулы/выражение ложно)
конца редактировать
(defun interpret() ; interpret if valid or not or inconsistent
(setq lastcolumn (- (column) 1))
(setq lastcolumnROW 1)
(loop
(unless (aref (aref tbl lastcolumn) lastcolumnROW) (progn (princ "The formula is Invalid")(return)))
(setq lastcolumnROW (+ lastcolumnROW 1))
(when (= lastcolumnROW (+ 1 (row))) (progn (princ "The formula is a Tautology ") (return)))
)
)
редактировать два: ///
Это LogicStart Функция:
(defun LogicStart()
;Function to run program
(princ "Enter Logical Expression or Formula: ")
(setq input (read))
;Get input
(format t "-----------------------------------------------~C" #\linefeed)
;Create two dimension array(table)
(setq tbl (make-array (column)))
(setq index 0)
(loop
(setf (aref tbl index) (make-array (+ (row) 1)))
(setq index (+ 1 index))
(when (= index (column))(return))
)
(setAtoms)
(setFirstValue)
(tblReplaceValue)
(watchTable)
(format t "-----------------------------------------------~C" #\linefeed)
(interpret)
)
setAtoms Функция:
(defun setAtoms()
;Get ALL possible formula
(setq indexOFTBL (make-array (column)))
(setq openP (make-array (- (column) (length Latoms))))
; Get index of open Parenthesis
(setq cOpenP 0)
(setq closeP (make-array (- (column) (length Latoms))))
;Get index of close Parenthesis
(setq cCloseP 0)
(setq index 0)
(loop
(when (char-equal (char input index) #\()
(progn
(setf (aref openP cOpenP) index)
(setq cOpenP (+ 1 cOpenP))
)
)
(when (char-equal (char input index) #\))
(progn
(setf (aref closeP cCloseP) index)
(setq cCloseP (+ 1 cCloseP))
)
)
(setq index (+ 1 index))
(when (= index (length input)) (return))
)
;(print openP)
;(print closeP)
(setq index 0)
(loop
(if (< index (length Latoms))
(progn
(setf (aref (aref tbl index) 0) (char Latoms index))
(setf (aref indexOFTBL index) index)
)
(progn
(setq OpIndex cOpenP)
(loop
(setq OpIndex (- OpIndex 1))
(setq CpIndex 0)
(loop
(if (or (> (aref openP OpIndex) (aref closeP CpIndex)) (= -1 (aref closeP CpIndex)))
(progn
(setq CpIndex (+ CpIndex 1))
)
(progn
(setf (aref (aref tbl index) 0) (subseq input (aref openP OpIndex) (+ 1 (aref closeP CpIndex))))
(setf (aref closeP CpIndex) -1)
(return)
)
)
(when (= CpIndex (length closeP))(return))
)
(setq index (+ index 1))
(when (= OpIndex 0) (return))
)
(return)
)
)
(setq index (+ index 1))
(when (= index (column)) (return))
)
)
watchTable и колонки функция
(defun watchTable()
; View table
(setq ro 0)
(loop
(setq co 0)
(loop
(princ(aref (aref tbl co) ro))(format t "~C" #\tab)
(setq co (+ 1 co))
(when (= co (column))(return))
)
(format t "~C" #\linefeed)
(setq ro (+ 1 ro))
(when (= ro (+ (row) 1))(return))
)
)
(defun column()
; Get the number of columns
(+ (atoms) (symbols))
)
// редактировать 3 Таким образом, для (ИЛИ (НЕ)), таблица не хватает "а не" in @ jkiiski
A | NOT A | (OR A (NOT A))
----+----------+--------
NIL | T | T
T | NIL | T
This expression is a Tautology.
Другой пример ссылки разностная: В то время как Р означает Q, этот код принимает подразумевает, как:>
; Logical Connectives:
; ~ negation
; - biconditional
; > conditional
;^and
; v or
; Example Input:
; "(~((a^b)>c))"
; "(p>q)"
p q p>q
T T T
T NIL NIL
NIL T T
NIL NIL T
Another example:
Enter an expression: "((p>q)^r)"
T <- True
NIL <- False
--------------------------------------------
p q r (p>q) ((p>q)^r)
T T T T T
T T NIL T NIL
T NIL T NIL NIL
T NIL NIL NIL NIL
NIL T T T T
NIL T NIL T NIL
NIL NIL T T T
NIL NIL NIL T NIL
--------------------------------------------
Так что в (р> д)^г она показывает р, д, г, (р> д) и, наконец, (р> д)^r на таблице истинности.
редактировать четыре //
(defun generate-value-combinations (variables)
(let ((combinations (list)))
(labels ((generate (variables &optional (acc (list)))
(if (endp variables)
(push (reverse acc) combinations)
(loop for value in '(t nil)
for var-cell = (cons (car variables) value)
do (generate (cdr variables) (cons var-cell acc))))))
(generate variables)
combinations)))
to this one?
(defun generate-value-combinations (variables)
(let ((combinations (list)))
(labels ((generate (variables &optional (acc (list)))
(if (endp variables)
(push (reverse acc) combinations)
(loop for value in '(t nil)
for var-cell = (cons (car variables) value)
do (generate (cdr variables) (cons var-cell acc))))))
(generate variables) nreverse combinations)))
Вы должны добавить больше кода, если вы хотите, чтобы кто-нибудь сможет помочь с этим. Вы также должны объяснить, с какой проблемой вы столкнулись. – jkiiski
Две формулы могут быть непоследовательными, но я не понимаю, что означает, что таблица истинности является непоследовательной. Это то, что вы должны объяснить. Кроме того, у меня есть несколько замечаний о вашем коде: progn не требуется, когда/за исключением; используйте тире в ваших именах (последний столбец); используйте «incf» вместо (setq x (+ x 1)) и, конечно, используйте локальные привязки LET вместо глобальных переменных SETQ. – coredump
В дополнение к упомянутым вещам @coredump, вы также хотите отложить свой код в стиле «lisp-like». – Vatine