使用 Racket 的逻辑范式的二次函数的零

Zero of a quadratic function using Racket's logic paradigm

首先,我想对以下问题表示歉意。我对Racket完全是菜鸟,但在了解了它的逻辑编程特性后,我很感兴趣。可悲的是,整个互联网上只有一个关于嵌入式 racklog 语言的教程,对我的情况并不是很有帮助。

所以我想做的是......好吧,我编写了这个简洁的小 Prolog 练习,通过插入 P 和 Q 来求解二次函数:

zero(P, Q) :-
    D is (P/2)*(P/2) - Q,
(   D < 0,
        write('No Zero'), nl;
    D = 0,
        X is -(P/2), write('x= '), write(X), nl;
    D > 0,
        X1 is -(P/2) + sqrt(D), write('x1= '), write(X1), nl,
        X2 is -(P/2) - sqrt(D), write('x1= '), write(X2), n).

现在我尝试在 Racket 中重写完全相同的程序。我还没有关心输出,但如果它一开始只是 works 肯定会有帮助。

#lang racket
(require racklog)

(define (%zero P Q)
    (define (D ((P/2)*(P/2) - Q))
        (cond
          [(< D 0) (error "No Zero")]
          [(= D 0) (-(P/2))]
          [(> D 0) (-(P/2) + sqrt(D)) (-(P/2) - sqrt(D))]
        )
     )
)

但是我只是在第 5 行收到一个错误:"define: not an identifier, identifier with default, or key procedure arg" 我很确定这只是众多错误中的第一个,因为我对 Racket 的语法一定存在严重的误解。但就我所拥有的,我现在几乎不知所措。 对于我做错了什么的一些提示,我将不胜感激。 真挚地, Dschehuti-Nefer

我不懂racklog,但是换装成Scheme的前缀符号应该是这样的:

(define (%zero P Q)
  (define D (- (* (/ P 2) (/ P 2)) Q))
  (cond
    [(< D 0) (error "No Zero")]
    [(= D 0) (- (/ P 2))]
    [(> D 0) (values (+ (- (/ P 2)) (sqrt D))
                     (- (- (/ P 2)) (sqrt D)))]))

不是我会推荐它,但 Racket 也有一种你可以使用的中缀表示法:

(define (%zero P Q)
  (define D (((P . / . 2) . * . (P . / . 2)) . - . Q))
  (cond
    [(< D 0) (error "No Zero")]
    [(= D 0) (- (P . / . 2))]
    [(> D 0) (values ((- (P . / . 2)) . + . (sqrt D))
                     ((- (P . / . 2)) . - . (sqrt D)))]))