2017-11-27 3 views
0

런타임 중에 변수를 어떻게 바꿀 수 있습니까?하스켈 - 런타임 중 변수 변경

data Ausdruck = K Wahrheitswert     -- Logical constant 
       | V Variable     -- Logical Variable 
       | Nicht Ausdruck    -- Logical negation 
       | Und Ausdruck Ausdruck   -- Logical and 
       | Oder Ausdruck Ausdruck  -- Logical or 
       | Impl Ausdruck Ausdruck  -- Logical implied 
       | Esgibt Variable Ausdruck  -- "exist" 
       | Fueralle Variable Ausdruck -- "all" 
            deriving (Eq,Show) 



type Variables = Variable -> Bool 

    variables1 :: Variable -> Bool 
    variables1 (Var N1) = True 
    variables1 (Var N2) = False 
    variables1 (Var N3) = True 
    variables1 (Var N4) = True 
    variables1 (Var N5) = False 




evaluate :: Prop -> Variables -> Bool 
evaluate (K bool) belegung = bool 
evaluate (V var) belegung = belegung var 
evaluate (Nicht ausdruck) belegung = not (evaluate ausdruck belegung) 
evaluate (Und ausdruck ausdruck2) belegung = (evaluate ausdruck belegung) && (evaluate ausdruck2 belegung) 
evaluate (Oder ausdruck ausdruck2) belegung = (evaluate ausdruck belegung) || (evaluate ausdruck2 belegung) 

지금 내가 한정사 "모든"을 추가 할 :

나는 이것을 얻었다. 그래서 N1을 False로 바꿀 때 여전히 진실론이라면 명제법을 확인하고 싶습니다. 그러나 런타임 중에 변수를 어떻게 변경할 수 있습니까?

감사합니다 마크

+0

'variables1 (Var N1) = False'와 같이 프로그램의 상태를 변경하는 사용자 입력을 제공하고 싶다는 점을 정확하게 알고 있습니까? –

+1

'evaluate'은 이미 매개 변수화되어 있습니다. 두 번째 인수로'variables1' 이외의 함수를 전달하면됩니다. – chepner

+0

Btw, Füralle은 완벽하게 합법적 인 생성자 이름입니다. – augustss

답변

1

새 값에 바인딩 변수와 기존 환경을 기반으로 새로운 환경 만들 수 있습니다

erweiternBelegung :: Variable -> Bool -> Variables -> Variables 
erweiternBelegung v b vs = \v' -> if v == v' then b else vs v' 

을하고 있는지 확인하는 데 사용할, 그 Fueralle 경우

... 
evaluate (Fueralle var ausdruk) belegung = 
    evaluate ausdruk (erweiternBelegung var True belegung) && 
    evaluate ausdruk (erweiternBelegung var False belegung) 

: var 모두 TrueFalse 때, ausdruck는 보유 실존 한정사 Esgibt&&||으로 바뀌는 것을 제외하고는 동일합니다.