首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在prolog中,如何表示由对象执行的状态转换和操作?

在prolog中,如何表示由对象执行的状态转换和操作?
EN

Stack Overflow用户
提问于 2015-02-06 21:53:26
回答 1查看 620关注 0票数 1

我有一个由几个城市状态节点和路径组成的问题域,这些节点和路径表示地点/城市之间的成本关联,而且智能体是一架可以从一个城市飞到另一个城市的直升机。场景问题是一架直升机从一个城市起飞,然后降落在另一个城市。我知道如何实现城市状态和转换,没有诸如起飞,土地等操作,我只是不确定你如何表示状态或数据结构方面的代理操作,以满足结果效果,如:-chopper_islanded(真),chopper_at(城市j)。

代码语言:javascript
复制
% nodes
place(rescueship).
place(citya).
place(cityb).
place(cityc).
place(cityd).
place(citye).
place(cityf).
place(cityg).
place(cityh).
place(cityi).
place(cityj).



% objects
is_chopper(chopper1).

% connections
path(rescueship, citya, 100).
path(rescueship, cityc, 200).
path(rescueship, cityb, 150).
path(cityc, cityd, 110).
path(cityd, citye, 140).
path(cityd, cityf, 100).
path(citya, cityi, 70).
path(cityi, cityg, 130).
path(cityb, cityg, 90).
path(cityi, cityf, 50).
path(citye, cityf, 90).
path(citye, cityj, 50).
path(cityh, cityj, 90).
path(cityi, cityh, 70).
path(citya,cityc,120).
path(citya,cityb,60).


% chopper attributes
chopper_islanded(true).
chopper_islanded(false).

chopper_at(X):- chopper_islanded(true); chopper_islanded(false), place(X), is_chopper(chopper1).

% place states,  G=on ground, A= in air,  v[list of conditions],Ch = chopper
state(v([G,A],P,Ch)):- chopper_islanded(G), chopper_islanded(A), place(P), chopper_at(Ch).


% chopper operations
%takeOff(V1,V2):- place(V1), place(V2).
%takeOff(v([_,A,P),v([false,A],P)).
%land(chopper):- chopper_islanded(false).
%flyto(p1,p2) :- path(p1,p2,_), chopper_islanded(false).

% tried many attempts to implement operations but couldn't understand how to represent an action

connected(P1,P2,C):- path(P1,P2,C) ; path(P2,P1,C).
transition(S1,S2,C) :- connected(S1,S2,C).


initial(rescueship).
goal(cityj).


%  breadth first search uses an initialised state and a goal state which has been omitted for clarity.
bfgs(P)

为了求解路径,我使用了广度优先搜索算法,它不需要任何斩波操作就可以很好地工作,它大致找到最快的路径,并返回行进节点的列表。我最大的问题是如何表示斩波器为了达到某种状态而执行的操作,以及使用什么数据结构最好?如果代码乱七八糟,我很抱歉!我在试图弄清楚语义时遇到了困难,所以我没有省略我的错误,以向别人证明我至少已经尝试过了。

EN

回答 1

Stack Overflow用户

发布于 2015-02-06 22:55:41

从行为和状态之间的关系来思考。

首先描述在斩波器的特定状态下的动作导致的结果。例如:

代码语言:javascript
复制
action_state0_state(take_off, landed, flying).
action_state0_state(land, flying, landed).
action_state0_state(crash, flying, crashed).
action_state0_state(repair, crashed, landed).

仅仅使用这些简单的定义,你就已经可以推断出动作列表和启动的直升机的最终状态-例如-在着陆位置:

代码语言:javascript
复制
?- length(As, _), foldl(action_state0_state, As, landed, S).
As = [],
S = landed
As = [take_off],
S = flying
As = [take_off, land],
S = landed
As = [take_off, crash],
S = crashed
As = [take_off, land, take_off],
S = flying
As = [take_off, crash, repair],
S = landed .

在这种情况下,动作列表似乎是一种合适的数据结构,因为空列表是有意义的,元素的数量事先是未知的,等等。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28367307

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档