输入Prolog

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)

Kaa*_*rel 5

一本详细讨论这类内容的书是 Michael A. Covington的Prolog程序员自然语言处理.

一般来说,你需要做的是

  1. 标记输入
  2. 解析令牌(例如使用DCG)以获取输入 routeplan/3
  3. 呼叫 routeplan/3
  4. 根据输出生成一些英语 routeplan/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)


Tom*_*ght 2

对于这类事情,我通常创建 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谓词的第三个变量是列表的列表。而且它是通过添加到尾部而构建的。如果不是,应该很容易适应。在评论中提问。