제가 틀렸다는 것을 증명 해보세요!


22

소개

인생에서 당신의 사명은 간단합니다 : 인터넷에서 사람들을 잘못 증명하십시오!
이를 위해 일반적으로 진술을 신중하게 분석하고 모순을 지적하십시오.
이것을 자동화 할 때가되었지만, 게 으르면서 가능한 한 최소한의 노력으로 (사람들이 가장 짧은 코드를 읽음) 잘못을 증명하고자합니다.

사양

입력

입력 한 내용은 일반적인 형태 의 공식입니다 . 형식의 경우, 언어의 요구에 따라 아래 형식을 사용하거나 직접 정의 할 수 있습니다 (하지만 순수한 CNF보다 형식으로 더 많이 인코딩 할 수는 없습니다). 그러나 테스트 사례 (여기)는 아래 형식으로 제공됩니다 (자체 생성하기는 어렵지 않지만).

입력은 변수 목록의 목록입니다 (문자열로 읽거나 문자열 필요). 입력은 일련 의 절로 작성된 CNF (Conjunctive Normal Form)의 공식으로 , 각각 두 목록의 목록입니다. 절의 첫 번째 목록은 양수 리터럴 (변수)을 인코딩하고 두 번째 목록은 음수 (음수) 리터럴 (변수)을 인코딩합니다. 절의 모든 변수는 함께 OR되고 모든 절은 AND로 함께 있습니다.

보다 명확하게하려면 다음 [[[A,B],[C]],[[C,A],[B]],[[B],[A]]]과 같이 읽을 수 있습니다.
(A OR B OR (NOT C)) AND (C OR A OR (NOT B)) AND (B OR (NOT A))

산출

출력은 부울 값입니다 (예 : 일부 실제 값 또는 일부 잘못된 값).

무엇을해야합니까?

간단합니다 : 주어진 공식이 만족 스러운지 확인하십시오. 예를 들어, 전체 공식이 "true"가되도록 모든 변수에 true와 false가 할당되어 있는지 확인하십시오. 수식을 만족할 수 있으면 출력이 "true"이고 그렇지 않으면 "false"가됩니다.
재미있는 사실 : 이것은 일반적인 경우 NP 완료 문제입니다.
참고 : 진리표를 생성하고 결과 항목이 true인지 확인하는 것이 허용됩니다.

코너 케이스

빈 3 단계 목록을 얻는다면 해당 절에 그러한 (긍정적 / 부정적) 변수가 없습니다-유효한 입력.
원하는 경우 다른 코너 케이스를 정의하지 않은 상태로 둘 수 있습니다.
빈 수식 (1 단계 목록)에서는 true를, 빈 절 (2 단계 목록)에서는 false를 반환 할 수도 있습니다.

누가 이겼어?

이것은 코드 골프이므로 바이트 단위의 최단 답변이 이깁니다!
물론 표준 규칙이 적용됩니다.

테스트 사례

[[[P],[Q,R]],[[Q,R],[P]],[[Q],[P,R]]] -> true
[[[],[P]],[[S],[]],[[R],[P]],[[U],[Q]],[[X],[R]],[[Q],[S]],[[],[P,U]],[[W],[Q,U]]] -> true
[[[],[P,Q]],[[Q,P],[]],[[P],[Q]],[[Q],[P]]] -> false
[[[P],[]],[[],[P,S]],[[P,T],[]],[[Q],[R]],[[],[R,S]],[[],[P,Q,R]],[[],[P]]] -> false
optional behavior (not mandatory, may be left undefined):
[] -> true (empty formula)
[[]] -> false (empty clause)
[[[],[]]] -> false (empty clause)

1
입력을 받아 볼까요 (A OR B OR (NOT C)) AND (C OR A OR (NOT B)) AND (B OR (NOT A))?
Adám

1
챌린지에 지정된대로 @ Adám은 형식이 목록 기반 정보보다 더 많은 정보를 인코딩하지 않는 한 전적으로 사용자에게 달려 있습니다. (예 :
처방전

@SEJPM 표기법을 올바르게 이해하면 3 번째 및 4 번째 테스트 사례가 true를 반환해야한다고 생각합니다. (P, Q) = (1,1) 및 (P, Q, R, S, T) = (0,0,0,0,0)을 대체하려고 시도하고 둘 다 true를 찾았으므로 적어도 하나가 있어야합니다. 표현식이 참인 경우.
busukxuan 2016 년

@ busukxuan, 나는 세 번째와 네 번째 것이 거짓임을 100 % 확신합니다. 3)의 경우 : 이것은 {{P,Q},{P,!Q},{!P,Q},{!P,!Q}}(순서가 아님) 모순으로 쉽게 보여 질 수 있습니다. 4)의 경우 : 이것은 P AND ... AND (NOT P)P의 가치에 대해 절대로 사실 이 될 수 없기 때문에 모순 입니다.
SEJPM

2
코드가 짧을수록 실제로 더 많은 노력이 필요하다는 것은 재미 있습니다.
user6245072

답변:


41

수학, 12 바이트

SatisfiableQ

글쎄, 내장 기능이 있습니다 ...

입력 형식은 And[Or[a, b, Not[c], Not[d]], Or[...], ...]입니다. 이것은 수행 하기 때문에, 빈 하위 표현에 대해 올바르게 일을 Or[]하다 False하고 And[]있다 True.

레코드의 경우 챌린지에서 목록 기반 형식을 수신하고 변환 자체를 수행하는 솔루션은 44 바이트이지만 OP는 추가 정보를 인코딩하지 않는 한 모든 형식이 괜찮다는 의견을 명확하게 설명했습니다.

SatisfiableQ[Or@@Join[#,Not/@#2]&@@@And@@#]&

18
Mathematica ...
Leaky Nun

11
Mathematica에는 실제로 엄청난 수의 내장 된 ._.가 있습니다
TuxCrafting 2016 년

3
@ TùxCräftîñg 실제로 .
jpmc26 2016 년

15
스플릿-초 동안, 나는이 대답이 모호한 스택 기반 esolang으로 작성되었다고 생각했는데 명령 시퀀스 S a t i s f i a b l e Q는 문제를 해결할 것입니다. 그런 다음에야 독해력이 문을 두 드렸습니다.
ojdo

3

하스켈, 203200 바이트

t=1<3
e%((t,f):r)=or((e<$>t)++map(not.e)f)&&e%r
e%_=t
u v b e s|s==v=b|t=e s
s e[]c=1<0
s e(v:w)c=e%c||s(u v t e)w c||s(u v(1<0)e)w c
g v[]=v
g v((t,f):r)=g(v++[x|x<-t++f,notElem x v])r
g[]>>=s(\x->t)

이 과제는 기본 제공 답변이 필요하므로 여기로 이동하십시오. ideone에서 사용해보십시오 . 이 알고리즘은 단순히 모든 변수 할당을 시도하고 그 중 하나가 수식을 만족하는지 확인합니다.

입력 형식은 [([],["P","Q"]),(["Q","P"],[]),(["P"],["Q"]),(["Q"],["P"])]문자열 대신 같지만 모든 유형이 작동하지만 문자열 형식입니다.

Ungolfed 코드 :

type Variable   = String
type CNF        = [([Variable], [Variable])]
type Evaluation = (Variable -> Bool)

satisfies :: Evaluation -> CNF -> Bool
satisfies eval [] = True
satisfies eval ((t,f):r) = or(map eval t ++ map (not.eval) f) && satisfies eval r

update :: Evaluation -> Variable -> Bool -> Evaluation
update eval s b var = if var == s then b else eval var

search :: Evaluation -> [Variable] -> CNF -> Bool
search eval [] cnf = False
search eval (v:vars) cnf = satisfies eval cnf || search (update eval v True) vars cnf || search (update eval v False) vars cnf 

getVars :: CNF -> [Variable] -> [Variable]
getVars [] vars = vars
getVars ((t,f):cnf) vars = getVars cnf (vars ++ [v |v<-(t++f), notElem v vars])

isSat :: CNF -> Bool
isSat cnf = search (\x->True) (getVars cnf []) cnf

1

자바 스크립트 6, 69B

x=>f=(v,e)=>(e=v.pop())?[0,1].some(t=>f([...v],eval(e+'=t'))):eval(x)

용법:

f('a|b')(['a','b'])
true
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.