2012-10-23 48 views
3

因此,我正在開發Unity3D遊戲,並且正在使用Prolog進行IA規劃。 我的問題是非常相似的猴子和香蕉問題,但我有問題斷言一個新的初始狀態。C#和SWI-Prolog - 將字符列表轉換爲事實列表

通過改變初始狀態,我的角色能夠在環境重要變化時重新計劃自己的行爲。

但是,讓我們回到我的問題:

我傳遞一個字符串,Prolog的,通過插座上,我想建立的事實清單。然後,我想用這些事實作爲我規劃程序的初始狀態。

我能夠通過將字節數組轉換爲字符列表在SWI終端上編寫套接字的輸入流。我也可以通過在輸出流上寫入一些東西來從prolog服務器獲取一個字符串。 但我不知道我應該如何將這些字符/字符串轉換爲事實列表。另外,我想用事實列表作爲初始狀態,將它傳遞給規劃過程,就像我將一個參數傳遞給一個命令式編程語言中的一個函數(如果是這種情況)。

我希望做的是這樣的(僞):

% on the prolog server, we have a main function 
% we get a bytestream (In), 
% turn it into a list of facts 
% use it as the initial state 
% and write Plan to the output stream (Out). 

loopback(In, Out) :-  
    \+at_end_of_stream(In),  
    read_pending_input(In, Codes, []),    
    atom_codes(AtomList, Codes),  %bytes into a list of atoms 
    toFacts(Init, AtomList),   %??? Init = AtomList to list of facts 
    test(Init, Plan),     %pass Init as the initial state 
    format(Out, '~s', Plan),   %Get the plan back and write to the output 
    flush_output(Out), 
    loopback(In, Out). 

% Init should look like this - a mere list of facts: 
Init = [on(monkey, floor), 
     on(box, floor), 
     at(monkey, a), 
     at(box, b), 
     at(bananas, c), 
     status(bananas, hanging)]. 

% The planning predicate - Init as an argument, Plan is the result 
test(Init, Plan):- 
    write('Initial state:'),nl, 
    write_sol(Init), 
    Goal = [status(bananas, grabbed)], 
    nl,write('Goal state:'),nl, 
    write(Goal),nl, 
     solve(Init,Goal,Plan). 

我真的很堅持,現在,我希望有人能幫助我。謝謝!

參考文獻:

Full monkey banana problem code.

SWI socket server code example.

回答

2

你有很多選擇:最簡單的似乎是read_from_codes

test :- 
    S = "[on(monkey, floor), 
     on(box, floor), 
     at(monkey, a), 
     at(box, b), 
     at(bananas, c), 
     status(bananas, hanging)].", 
    read_from_codes(S, T), 
    writeln(T). 

結果

?- test. 
[on(monkey,floor),on(box,floor),at(monkey,a),at(box,b),at(bananas,c),status(bananas,hanging)] 
true. 

但是使用像JSON這樣的專用協議可以更輕鬆地交換結構化數據。我只是通過AJAX/jQuery使用它。也許矯枉過正你的使用情況......

+0

美麗,read_from_codes正是我所需要的。謝謝! –

1

http://tinycog.sourceforge.net/我們使用的是SWI-Prolog的HTTP服務器和Unity3D HTTP調用使用的兩端爲複雜的術語等等。其實小C#腳本編碼JSON庫來構建的界面在Unity3D端只是將所有GameObjects的位置發送到SWI服務器,並接收Unity3D級別執行的命令列表,包括「goto」,「grab」和「fire」。 SWI-Prolog代碼位於GIT存儲庫中,C#中的Unity3D代碼是項目文件中客戶端ZIP的一部分。