我目前正在开发一个递归Prolog程序,将路由连接在一起,以创建伯明翰地区的基本GPS。目前,我可以得到这样的输出:
输入
routeplan(selly_oak, aston, P).输出
P = [selly_oak, edgbaston, ... , aston]我想要做的是让我的程序提供某种界面,所以如果我要输入一些类似于:
Route from selly_oak to aston它将为我提供:
Go from selly_oak to edgbaston
Go from edgbaston to ...
Finally, Go from ... to aston.Prolog是一种强大的语言,因此我认为这是很容易实现的,但是我所读到的许多书似乎跳过了这一部分。据我所知,我不得不使用写()和read()这样的东西,尽管我不知道细节。
这里有谁是Prolog新手,能提供一些基本的例子或链接到更多信息吗?
编辑:很多答案看起来都很复杂,解决方案应该只有5-10行代码。阅读一个值并不是一个问题,因为我可以按照以下几点来做一些事情:
find:-
write('Where are you? '),
read(X),
nl, write('Where do you want to go? '),
read(Y),
loopForRoute(X,Y).如果可以使用write()写出输出,那么就可以使用新行(nl),这样就可以像上面的输出那样显示输出。
如果这是我的输入,那么我将如何安排顶级路由计划()来处理这些输入?此外,如果我要为这些站添加行作为一个额外的参数,这将如何实现呢?所有链接都在文件的开头定义如下:
rlinks(selly_oak, edgbaston, uob_line).
rlinks(edgbaston, bham_new_street, main_line).因此,有了这些信息,就可以这样读懂这一行了。
Go from selly_oak to edgbaston using the uob_line
Go from edgbaston to ... using the ...
Finally, go from ... to aston using the astuni_line发布于 2009-04-02 18:14:07
对于这种情况,我通常会创建shell谓词。所以在你的情况下。
guided:-
print('Enter your start point'),nl,
read(Start),
print('Enter your destination'),nl,
read(Dest),
routeplan(Start, Dest, Route),
print_route(Route).而print_this/1可以是递归的,如下所示:
print_route([]).
print_route([[A,B,Method]|Tail]):-
print_route(Tail),
print('Go from '), print(A),
print(' to '), print(B),
print(' by '), print(Method), nl.我假设routeplan/3谓词的第三个变量是列表列表。而且它是通过增加尾巴来建造的。如果它不是,它应该是相当容易适应。请在评论中提问。
发布于 2009-03-24 11:45:15
一本详细讨论这类事情的书是MichaelA.Covington的Prolog程序员的自然语言处理。
一般来说,你需要做的是
routeplan/3的输入routeplan/3routeplan/3的输出生成一些英语类似这样的东西(在SWI中工作):
% Usage example:
%
% ?- query_to_response('Route from selly_oak to aston', Response).
%
% Response = 'go from selly_oak to edgbaston then go from edgbaston
% to aston then stop .'
%
query_to_response(Query, Response) :-
concat_atom(QueryTokens, ' ', Query), % simple tokenizer
query(path(From, To), QueryTokens, []),
routeplan(From, To, Plan),
response(Plan, EnglishTokens, []),
concat_atom(EnglishTokens, ' ', Response).
% Query parser
query(path(From, To)) --> ['Route'], from(From), to(To).
from(From) --> [from], [From], { placename(From) }.
to(To) --> [to], [To], { placename(To) }.
% Response generator
response([_]) --> [stop], [.].
response([From, To | Tail]) -->
goto(path(From, To)), [then], response([To | Tail]).
goto(path(From, To)) --> [go], from(From), to(To).
% Placenames
placename(selly_oak).
placename(aston).
placename(edgbaston).
% Mock routeplan/3
routeplan(selly_oak, aston, [selly_oak, edgbaston, aston]).发布于 2009-03-24 10:47:46
嗯,如果我没听错你的话,你只是想把名单的格式很好地打印出来,不是吗?
在SWI-Prolog中,这个工作:
output_string([A,B],StrIn,StrOut) :-
concat_atom([StrIn, 'Finally, Go from ', A, ' to ', B, '.'],StrOut),
write(StrOut).
output_string([A,B|Rest],StrIn,StrOut) :-
concat_atom([StrIn,'Go from ', A, ' to ', B, '.\n'],StrAB),
output_string([B|Rest],StrAB,StrOut).然后打电话给
output_string(P,'',_).它可能不是很有效率,但它做的工作。:)
https://stackoverflow.com/questions/676707
复制相似问题