这次我的问题主要是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的全部新手错过了这里。我提前谢谢了!
答案 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)))