Scheme 如何在Racklog中的谓词中使用“%bag of”原语

Scheme 如何在Racklog中的谓词中使用“%bag of”原语,scheme,racket,Scheme,Racket,这次我的问题主要是Racklog。我想是吧。也可能是这次的球拍语法 这个想法相当简单。我有一个由位置和对象组成的逻辑库,我只是想尝试使用%bag原语打印所有对象 我的逻辑基础如下所示: (define %contains (%rel () [('bridge 'phaser)] [('engine_room 'toolkit)] [('toolkit 'screwdriver)] [('toolkit 'tricorder)] [(

这次我的问题主要是Racklog。我想是吧。也可能是这次的球拍语法

这个想法相当简单。我有一个由位置和对象组成的逻辑库,我只是想尝试使用%bag原语打印所有对象

我的逻辑基础如下所示:

(define %contains
  (%rel ()
      [('bridge 'phaser)]
      [('engine_room 'toolkit)]
      [('toolkit 'screwdriver)]
      [('toolkit 'tricorder)]
      [('inventory '(communicator, no_tea))]
     )
  )
现在我有了我的谓词,它是下面的一个。它只需通过查询%which%列出\u对象的工具箱来调用,然后给出工具箱中的所有项目

(define %list_objects
  (%rel (place)
    [(place)
     (%which (objects)
       (%let (x)
           (%bag-of x (%contains place x)
               objects)))]
    )
  )
奇怪的是,当我从%which objects。。。然后直接把它扔给听者,效果非常好。但是如果我在谓词中使用它,它会抛出以下异常:

"application: not a procedure;
 expected a procedure that can be applied to arguments
  given: '((objects screwdriver tricorder))
  arguments...: [none]"

我多次尝试重新排列代码,但现在我对我做错了什么感到困惑。我希望你们能给我一个小小的暗示,我作为一个完全的新手,在这里并没有计划好。先谢谢你

问题在于,目标%。。。返回答案,而不是新关系。因此%list\u对象不能按您想要的方式使用

也许这对你有用

#lang racket
(require racklog)

(define %contains
  (%rel ()
        [('bridge      'phaser)]
        [('engine_room 'toolkit)]
        [('toolkit     'screwdriver)]
        [('toolkit     'tricorder)]
        [('inventory   '(communicator, no_tea))]))

(define %list_objects
  (%rel (place)
        [(place)
         (%let (x) (%contains place x))]))

(%which (x) (%list_objects x))
(%more)
(%which (bag) (%let (x) (%bag-of x (%list_objects x) bag)))

(define tools-in-toolkit (map cdar (%find-all (tool) (%contains 'toolkit tool))))

(define %in-toolkit
  (%rel (tool)
        [(tool) (%member tool tools-in-toolkit)]))

(%find-all (tool) (%in-toolkit tool))
输出:

'((x . bridge))
'((x . engine_room))
'((bag bridge engine_room toolkit toolkit inventory))
'(((tool . screwdriver)) ((tool . tricorder)))

您输入的是什么导致错误?感谢您目前的回答。我明白你的意思&这只针对听众。但据我从词汇表中了解,%bag of返回的是目标合同,而不是答案。那么,真的没有办法在谓词中使用它吗?@DschehutiNefer我添加了一个示例,其中在谓词中使用了%member。不过,最好直接使用%contains工具包工具。