2015-10-18 55 views
0

這次我的問題主要是Racklog。我猜。這次也可以是Racket語法。如何在Racklog中的謂詞中使用「%bag-of」原語

這個想法很簡單。我有一個由地點和對象組成的邏輯基礎,我只是想嘗試使用%bag原語打印所有對象。

我的邏輯基礎是這樣的:

(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)))] 
    ) 
) 

奇怪的是,當我剛剛thake部分從「%,其中(對象)......)」起,直接扔到監聽器,它完美的罰款。但是如果我使用它的謂詞中,它拋出此異常:

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

我試圖重新排列碼好幾次,但現在我很爲難約我做錯了什麼。我會很感激一點暗示,我作爲Scheme和Racket的總Newbee錯過了這裏。我提前感謝!

+0

你怎麼進入挑起這個錯誤嗎? – soegaard

回答

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))) 
+0

感謝迄今爲止的答案。我明白你的觀點,即「哪個」僅適用於聽衆。但據我所知,術語表中的「%bag-of」會返回目標合同而不是答案。那麼是否真的沒有辦法在謂詞中使用它? –

+0

@DschehutiNefer我已經添加了一個例子,在謂詞中使用'%member'。直接使用'(%contains'工具包工具)'會更好。 – soegaard