使用 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)))]))
首先,我想对以下问题表示歉意。我对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)))]))