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