我想在Prolog中实现一个搜索功能,当我输入一个字母时,它会显示建议的字词,从该字母开始动态显示。
作为一个起点,我试图找到一种方法来获取从给定字母开始的单词列表。但我找不到任何可以尝试的东西。
答案 0 :(得分:2)
这听起来像一个有价值的项目,不仅适合初学者。大多数复杂性都应该被用户交互。你应该细分你的任务 - 首先是:
例如,使用基本的Prolog IO和vanilla单词'database:
word("prolog").
word("programming").
word("algorithm").
word("word").
user_interface(SelectedSoFar, SelectedWord) :-
% get a sorted set of matched words rest
( setof(Rest, Word^(word(Word), append(SelectedSoFar, Rest, Word)), Matched)
-> ( Matched = [Choosed] % only 1 choice available ?
-> append(SelectedSoFar, Choosed, SelectedWord) % terminate
; % display list, get next char, recurse
forall(member(Rest, Matched), format('~s^~s~n', [SelectedSoFar, Rest])),
get(C),
append(SelectedSoFar, [C], ExtendedSel),
user_interface(ExtendedSel, SelectedWord)
)
; writeln('no match, retry'),
append(WithoutLast, [_], SelectedSoFar), % discard last - BUG: swapped arguments
user_interface(WithoutLast, SelectedWord)
).
示例互动:
?- user_interface("",W).
^algorithm
^programming
^prolog
^word
|: w
W = "word".
?- user_interface("",W).
^algorithm
^programming
^prolog
^word
|: p
p^rogramming
p^rolog
|: r
pr^ogramming
pr^olog
|: o
pro^gramming
pro^log
|: g
W = "programming".
编辑:我已经纠正了错误,请注意评论%丢弃最后....
你看到的地方(例如)
|: w
我输入了一个char 和一个'回车'。这是一个非常基本的界面......你至少应该接受一个字符串,而不是一个字符串。请参阅Prolog手册。
答案 1 :(得分:0)
您需要的是名为 trie 的数据结构。您可以在
了解它们任何好的算法书,比如Robert Sedgewick的Algorithms,都会详细介绍。这是Jon Bentley和Robert Sedgewick撰写的一篇可能有用的文章Fast Algorithms for Sorting and Searching Strings。
根据其手册, google-fu 建议YAP Prolog有一个built-in trie implementation。以下是关于prolog中的trie实现的讨论:http://computer-programming-forum.com/55-prolog/59e7d719f1e1d18f.htm
我怀疑你会发现在prolog中代表trie相对简单。工作将在字典中填充树。编写一个程序来阅读你的字典并生成trie作为prolog事实将是更难的部分。