使用Racket逻辑范例

时间:2015-10-17 10:44:27

标签: scheme racket logic-programming

首先,我想为以下问题道歉。我是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-内弗

1 个答案:

答案 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)))]))