논리식을 결합 형 정규 형식으로 변환


10

골:

명제 논리 (이후 논리식 또는 식이 라고 함) 의 공식을 취해 그 공식을 결부 정규 형식으로 출력 하는 완전한 프로그램 또는 함수를 작성하십시오 . 두 가지 상수는, 단항 연산자, 참과 거짓을 나타내는 ¬부정을 나타내는 이진 연산자 , , , 그리고 의미, 동등한 결합 및 분리를 나타내는 각각 어떤 (일반적인 논리 연산의 모든 순종 드 모르 강의 법칙 , 이중 부정 제거 등).

결 합 일반 형식은 다음과 같이 정의됩니다.

  1. 모든 원자 표현 ( 및 포함 )은 결합 형 정규 형식입니다.
  2. 이전에 생성 된 표현의 부정은 결합 된 정규 형식입니다.
  3. 이전에 생성 된 두 가지 표현의 결합은 결합적인 정규 형식입니다.
  4. 이전에 생성 된 두 표현식의 연결은 결사 정규 형식입니다.
  5. 다른 표현은 결합 된 정상적인 형태가 아닙니다.

임의의 논리식은 고유하지 않은 형태의 결합 된 정규 형식으로 논리적으로 동등한 식으로 변환 될 수 있습니다 ( 이 알고리즘 참조 ). 해당 특정 알고리즘을 사용할 필요는 없습니다.

입력:

편리한 형식으로 입력 할 수 있습니다. 예를 들어, 기호 논리 표현식 (언어가 지원하는 경우), 문자열, 기타 데이터 구조. 여기에서와 같이 true, false 및 논리 연산자에 동일한 기호를 사용할 필요는 없지만 선택은 일관성이 있어야하며 명확하지 않은 경우 선택에 대한 설명을 선택해야합니다. 다른 입력을 수락하거나 입력 형식으로 추가 정보를 인코딩 할 수 없습니다. 임의의 수의 원자 표현을 표현할 수있는 방법이 있어야합니다. 예를 들어 정수, 문자, 문자열 등

산출:

편리한 형식의 결 합 일반 형식의 수식입니다. 입력과 같은 형식 일 필요는 없지만 차이점이 있는지 설명해야합니다.

테스트 사례 :

P ∧ (P ⇒ R) -> P ∧ R
P ⇔ (¬ P) -> ⊥
(¬ P) ∨ (Q ⇔ (P ∧ R)) -> ((¬ P) ∨ ((¬ Q) ∨ R)) ∧ ((¬ P) ∨ (Q ∨ (¬ R)))

노트:

  1. 입력 표현식이 타우 톨 로지이면 유효한 출력이됩니다. 마찬가지로 입력 표현식이 모순이면 유효한 출력이됩니다.
  2. 입력 및 출력 형식 모두 가능한 모든 논리식을 표현할 수있는 잘 정의 된 연산 순서를 가져야합니다. 어떤 종류의 괄호가 필요할 수 있습니다.
  3. 논리 연산에 대해 잘 정의 된 접두사, 접두사 또는 접미사 표기법을 선택할 수 있습니다. 선택 사항이 표준과 다를 경우 (음은 접두사이고 나머지는 접두사 임) 답에 설명하십시오.
  4. 결 합 일반 형태는 일반적으로 독특하지 않습니다 (재주문까지). 유효한 양식 만 출력 하면 됩니다.
  5. 그러나 원자 표현식을 나타내면 논리 상수, 연산자 및 그룹화 기호 (있는 경우)와 구별되어야합니다.
  6. 결합 형 정규 형식을 계산하는 내장이 허용됩니다.
  7. 표준 허점 은 금지되어 있습니다.
  8. 이것은 . 최단 답변 (바이트)이 이깁니다.


1
CNF는 재정렬에 고유하지 않습니다. 동등한 표현 P이며 (P ∨ Q) ∧ (P ∨ (¬Q))결합 된 정규 형식입니다.
Greg Martin

1
타우 톨 로지 / 모순을 점검하는 것은 CNF 변환과 관련이없는 두 번째 과제이므로,이 요구 사항을 철회하고 자체 도전에 투입 할 것을 제안합니다.
Laikoni

@Laikoni 매우 사실입니다. 나는 이것이 필요한 출력이 아닌 타톨 로지 및 모순에 대한 가능한 출력이라고 말하기 위해 질문을 업데이트했습니다.
ngenisis

답변:



8

넌 날 미워할거야 ....

매스 매 티카, 23 바이트

#~BooleanConvert~"CNF"&

입력이 사용 True하고 False대신 질문의 표기법과 매우 유사합니다, 그렇지 않은 :하지만, 모든 문자 ¬, , , , 및 매스 매 티카 (인식하는 경우 2227 UTF-8 문자 00AC, F523, 29E6와 입력 , 및 2228)과 괄호가 예상대로 작동합니다.

기본적으로 출력은 Mathematica의 기본 기호를 사용합니다. 예를 들어 마지막 테스트 케이스는 (! P || ! Q || R) && (! P || Q || ! R)대신에 출력 됩니다 ((¬ P) ∨ ((¬ Q) ∨ R)) ∧ ((¬ P) ∨ (Q ∨ (¬ R))). 그러나 기능을

TraditionalForm[#~BooleanConvert~"CNF"]&

출력을 예쁘게 보이고 다음과 같은 일반적인 기호와 일치하게 만듭니다.

전통적인 형태


2

자바 스크립트 (ES6), 127 바이트

f=(s,t='',p=s.match(/[A-Z]/),r=RegExp(p,'g'))=>p?'('+f(s.replace(r,1),t+'|'+p)+')&('+f(s.replace(r,0),t+'|!'+p)+')':eval(s)?1:0+t

I / O 형식은 다음과 같습니다 (우선 순위 순).

  • (: (
  • ): )
  • : 1
  • : 0
  • ¬: !
  • : <=
  • : ==
  • : &
  • : |

예 :

P&(P<=R) -> ((1)&(0|P|!R))&((0|!P|R)&(0|!P|!R))
P==(!P) -> (0|P)&(0|!P)
(!P)|(Q==(P&R)) -> (((1)&(0|P|Q|!R))&((0|P|!Q|R)&(1)))&(((1)&(1))&((1)&(1)))

이 함수는 사소한 정규 형식을 생성하도록 간단하게 다시 작성되었습니다.

f=(s,t='',p=s.match(/[A-Z]/),r=RegExp(p,'g'))=>p?'('f(s.replace(r,1),t+'&'+p)+')|('+f(s.replace(r,0),t+'&!'+p)+')':eval(s)?1+t:0

출력에서 위의 우선 순위를 가정하여 출력 예제에서 모든 괄호를 제거하면 8 바이트를이 버전에서 저장할 수 있습니다.

P&(P<=R) -> ((1&P&R)|(0))|((0)|(0))
P==(!P) -> (0)|(0)
(!P)|(Q==(P&R)) -> (((1&P&Q&R)|(0))|((0)|(1&P&!Q&!R)))|(((1&!P&Q&R)|(1&!P&Q&!R))|((1&!P&!Q&R)|(1&!P&!Q&!R)))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.