Множественные условия без использования логических операторов в схеме

#functional-programming #scheme #racket

#функциональное программирование #схема #ракетка

Вопрос:

Я не знаю, как задать этот вопрос. По сути, мой профессор решил проблему, в которой он не использовал логическое выражение (and , or, not) в операторе cond . Итак, я попытался придумать фиктивный пример, и я заметил кое-что особенное. Как вы можете видеть ниже. Я не знаю, почему true false дает мне false вместо перехода к оператору else, но когда я делаю false true, он переходит к оператору else. Я рассматриваю это как оператор AND, и я знаю, что ошибаюсь.

 (cond ((= 2 2) (= 3 3))
      (else "Hello"))   ; --> T T --> #t

(cond ((= 2 2) (= 3 1))
      (else "Hello"))   ; --> T F --> #f

(cond ((= 2 1) (= 3 3))
      (else "Hello"))   ; --> F T --> "Hello"

(cond ((= 2 1) (= 3 1))
      (else "Hello"))   ; --> F F --> "Hello"
  

Комментарии:

1. Car каждого предложения является условием, а все остальное — это то, что выполняется, если выполняется это условие.

Ответ №1:

Есть три уравнения, которые вы должны знать.

1.

 (cond
  [#t <A>]
  .........)
  

оценивает до <A> .

2.

 (cond
  [#f <A>]
  .........)
  

оценивает, чтобы

 (cond
  .........)
  

То есть, когда LHS предложения есть #f , просто «вычеркните» это предложение.

3.

 (cond
  [else <A>])
  

оценивает до <A> .

В ваших примерах:

1.

 (cond ((= 2 2) (= 3 3))
      (else "Hello"))
  

=

 (cond (#t (= 3 3))
      (else "Hello"))
  

Используя первое уравнение, мы получаем, что результат должен быть (= 3 3) = #t .

2.

 (cond ((= 2 2) (= 3 1))
      (else "Hello"))
  

=

 (cond (#t (= 3 1))
      (else "Hello"))
  

Используя первое уравнение, мы получаем, что результат должен быть (= 3 1) = #f .

3.

 (cond ((= 2 1) (= 3 3))
      (else "Hello"))
  

=

 (cond (#f (= 3 3))
      (else "Hello"))
  

Используя второе уравнение, мы получаем, что оно должно вычисляться как:

 (cond (else "Hello"))
  

Используя третье уравнение, мы получаем, что оно должно оцениваться "Hello" как .

4.

 (cond ((= 2 1) (= 3 1))
      (else "Hello"))
  

=

 (cond (#f (= 3 1))
      (else "Hello"))
  

Используя второе уравнение, мы получаем, что оно должно вычисляться как:

 (cond (else "Hello"))
  

Используя третье уравнение, мы получаем, что оно должно оцениваться "Hello" как .

Ответ №2:

cond Синтаксис

 (cond (condition1 value1)
      (condition2 value2)
      ...
      (conditionN valueN))
  

Итак, вашими условиями являются (= 2 2) , (= 2 1) , и else (что эквивалентно #t в a cond -выражении), а возможными значениями являются (= 3 3) , (= 3 1) , и «Привет».

И

 (cond (condition value1) 
      (else value2))
  

эквивалентно

 (if condition value1 value2)
  

итак, у вас есть эквивалент

 (if (= 2 2)
    (= 3 3)
    "Hello")

(if (= 2 2)
    (= 3 1)
    "Hello")
  

и так далее.