Mik*_*e B 8 mapping prolog dcg
我目前正在开发一个递归的Prolog程序,将路线链接在一起,以创建伯明翰地区的基本 GPS.目前我可以得到输出:
输入
routeplan(selly_oak, aston, P).
Run Code Online (Sandbox Code Playgroud)
产量
P = [selly_oak, edgbaston, ... , aston]
Run Code Online (Sandbox Code Playgroud)
我想要做的是让我的程序提供某种界面,所以如果我要键入以下内容:
Route from selly_oak to aston
Run Code Online (Sandbox Code Playgroud)
它会为我提供:
Go from selly_oak to edgbaston
Go from edgbaston to ...
Finally, Go from ... to aston.
Run Code Online (Sandbox Code Playgroud)
Prolog是一种强大的语言,因此我认为这很容易实现,但是我所采用的许多书籍似乎都跳过了这一部分.据我所知,我必须使用write()和read()的内容,尽管我不知道细节.
有没有人可以在Prolog新手中找到一些基本的例子或链接到更多信息?
编辑:很多这些答案看起来非常复杂,解决方案应该只有大约5-10行代码.读取值不是问题,因为我可以按照以下方式执行操作:
find:-
write('Where are you? '),
read(X),
nl, write('Where do you want to go? '),
read(Y),
loopForRoute(X,Y).
Run Code Online (Sandbox Code Playgroud)
如果可以使用write()写出输出,我更喜欢它,因此可以使用新行(nl),以便它显示为上面的输出.
如果这是我的输入,那么我如何安排顶部routeplan()来处理这些输入?另外,如果我要将这些电台的线路作为额外参数添加,那么它将如何实施呢?所有链接都在文件的开头定义,如下所示:
rlinks(selly_oak, edgbaston, uob_line).
rlinks(edgbaston, bham_new_street, main_line).
Run Code Online (Sandbox Code Playgroud)
因此,有了这些信息,能够如此读取该行是一件好事.
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
Run Code Online (Sandbox Code Playgroud)
一本详细讨论这类内容的书是 Michael A. Covington的Prolog程序员的自然语言处理.
一般来说,你需要做的是
routeplan/3routeplan/3routeplan/3像这样的东西(适用于SWI-Prolog):
% 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]).
Run Code Online (Sandbox Code Playgroud)
对于这类事情,我通常创建 shell 谓词。所以就你的情况...
guided:-
print('Enter your start point'),nl,
read(Start),
print('Enter your destination'),nl,
read(Dest),
routeplan(Start, Dest, Route),
print_route(Route).
Run Code Online (Sandbox Code Playgroud)
print_route/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.
Run Code Online (Sandbox Code Playgroud)
我假设routeplan/3谓词的第三个变量是列表的列表。而且它是通过添加到尾部而构建的。如果不是,应该很容易适应。在评论中提问。