PasteRack.org | ||
Paste # 63743 | ||
2023-07-10 05:03:50 | ||
Fork as a new paste. | ||
Paste viewed 328 times. | ||
Tweet | ||
Embed: | ||
#lang racket (require slib/format srfi/1) ;;; P46 (**) Truth tables for logical expressions. ;;; Approach: Use pattern matching to parse expressions. ;;; Catamorphic patterns a la SRFI-241 would be useful here but they can be emulated with app (define (table a-sym b-sym expr) (define (eval-table a-sym a b-sym b table) (define cat (curry eval-table a-sym a b-sym b)) ; aka catamorphism (match table [(== a-sym eq?) a] [(== b-sym eq?) b] [`(not ,(app cat expr1)) (not expr1)] [`(and ,(app cat expr1) ,(app cat expr2)) (and expr1 expr2)] [`(or ,(app cat expr1) ,(app cat expr2)) (or expr1 expr2)] [`(nand ,(app cat expr1) ,(app cat expr2)) (not (and expr1 expr2))] [`(nor ,(app cat expr1) ,(app cat expr2)) (not (or expr1 expr2))] [`(xor ,(app cat expr1) ,(app cat expr2)) (xor expr1 expr2)] [`(impl ,(app cat expr1) ,(app cat expr2)) (if expr1 expr2 #t)] [`(equ ,(app cat expr1) ,(app cat expr2)) (eq? expr1 expr2)])) (format #t "~A~1,5@T~A~1,5@TResult~%" a-sym b-sym) (for* ([a (in-list '(#t #f))] [b (in-list '(#t #f))]) (format #t "~A~1,5@T~A~1,5@T~A~%" a b (eval-table a-sym a b-sym b expr)))) (table 'A 'B '(and A (or A B))) ;;; P47 (*) Truth tables for logical expressions (2). ;;; Approach: Convert the infix notated expressions to prefix notation and solve using the above P46 function (define (infix-table a-sym b-sym expr) (define (infix->prefix expr) (match expr [(== a-sym eq?) a-sym] [(== b-sym eq?) b-sym] [(list 'not (app infix->prefix expr1)) (list 'not expr1)] [(list (app infix->prefix expr1) (? symbol? binary-op) (app infix->prefix expr2)) (list binary-op expr1 expr2)])) (table a-sym b-sym (infix->prefix expr))) (displayln "---") (infix-table 'A 'B '(A and (A or (not B)))) ;;; P48 (**) Truth tables for logical expressions (3). ;;; Evaluate infix expressions directly using an arbitrary number of symbols instead of a fixed 2. ;;; Just use a simple alist for the symbol table (define (infix-table* symbols expr) (define (eval-table symtab expr) (define cat (curry eval-table symtab)) (match expr [(? symbol? (app (curryr assq symtab) (cons sym val))) val] [`(not ,(app cat expr1)) (not expr1)] [`(,(app cat expr1) and ,(app cat expr2)) (and expr1 expr2)] [`(,(app cat expr1) or ,(app cat expr2)) (or expr1 expr2)] [`(,(app cat expr1) nand ,(app cat expr2)) (not (and expr1 expr2))] [`(,(app cat expr1) nor ,(app cat expr2)) (not (or expr1 expr2))] [`(,(app cat expr1) xor ,(app cat expr2)) (xor expr1 expr2)] [`(,(app cat expr1) impl ,(app cat expr2)) (if expr1 expr2 #f)] [`(,(app cat expr1) equ ,(app cat expr2)) (eq? expr1 expr2)])) (format #t "~{~A~1,5@T~}Result~%" symbols) (let loop ([symbols symbols] [symtab '()]) (cond [(null? symbols) (void (format #t "~{~A~1,5@T~}~A~%" (reverse (map cdr symtab)) (eval-table symtab expr)))] [else (loop (cdr symbols) (alist-cons (car symbols) #t symtab)) (loop (cdr symbols) (alist-cons (car symbols) #f symtab))]))) (displayln "---") (infix-table* '(A B C) '((A and (B or C)) equ ((A and B) or (A and C))))
=>
standard-module-name-resolver: collection not found for module path: slib/format collection: "slib" in collection directories: /home/pasterack/.local/share/racket/8.8/collects /home/pasterack/racket88/collects/ ... [179 additional linked and package directories] context...: /home/pasterack/racket88/collects/racket/require-transform.rkt:266:2: expand-import /home/pasterack/racket88/collects/racket/private/reqprov.rkt:648:16 /home/pasterack/racket88/collects/racket/private/reqprov.rkt:646:2: filter-by-mode /home/pasterack/racket88/collects/racket/require-transform.rkt:266:2: expand-import /home/pasterack/racket88/collects/racket/private/reqprov.rkt:287:21: try-next /home/pasterack/racket88/collects/racket/private/reqprov.rkt:401:21: try-next /home/pasterack/racket88/collects/racket/private/reqprov.rkt:258:2 /home/pasterack/racket88/collects/syntax/wrap-modbeg.rkt:46:4 /home/pasterack/racket88/share/pkgs/scribble-lib/scribble/run.rkt:175:26: go .../private/map.rkt:40:19: loop .../racket/cmdline.rkt:191:51 body of "/home/pasterack/racket88/share/pkgs/scribble-lib/scribble/run.rkt"