如何使用"%bag-of" Racklog

时间:2015-10-18 17:59:28

标签: scheme racket

这次我的问题主要是Racklog。我猜。这次也可能是Racket语法。

这个想法很简单。我有一个由地点和对象组成的逻辑基础,我只想尝试使用%bag-of primitive打印所有对象。

我的逻辑基础如下:

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

现在我的谓词是以下的。应该使用查询"(%which()(%list_objects' toolkit))"简单地调用它。然后给出工具包中的所有项目。例如。

(define %list_objects
  (%rel (place)
    [(place)
     (%which (objects)
       (%let (x)
           (%bag-of x (%contains place x)
               objects)))]
    )
  )

奇怪的是,当我从'#34;%(对象)......)"然后将它直接扔进听众,它完美无缺。但是如果我在谓词中使用它,它会抛出这个异常:

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

我尝试过几次重新排列代码,但是现在我对我做错了什么感到非常难过。我很感激有点暗示我作为Scheme和Racket的全部新手错过了这里。我提前谢谢了!

1 个答案:

答案 0 :(得分:0)

问题是目标(%which ...)会返回答案(而非新关系)。因此,%list_objects无法以您希望的方式使用。

也许这适合你?

#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)))