首先,我想为以下问题道歉。我是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中重写完全相同的程序。我还没有关心输出,但如果它首先工作肯定会有所帮助。
#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行的错误:&#34;定义:不是标识符,默认标识符,或关键过程arg&#34; 我很确定这只是许多错误中的第一个错误,因为对于我的语法一定存在严重的误解。但是凭借我所获得的东西,我现在几乎感到茫然。 我会很感激我做错了什么。 此致 Dschehuti-内弗
答案 0 :(得分:0)
我不了解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)))]))