因此,我正在開發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.
美麗,read_from_codes正是我所需要的。謝謝! –