【问题标题】:Find all possible combinations of words in given format查找给定格式的所有可能的单词组合
【发布时间】:2017-07-01 10:56:40
【问题描述】:

我有 100 000 行长的字典:

w([w,o,r,d]).
w([h,a,p,p,y]).
w([q,u,e,s,t,i,o,n]).
...

现在我正在编写一个脚本,它将返回符合给定格式的所有可能的单词。

例如:

w([A,B,C]), w([B,C]), A \== B, A \== C, B \== C.

我找到了使所有变量不同的来源:

alldif([]).
alldif([E|Es]) :-
   maplist(dif(E), Es),
   alldif(Es).

所以现在我打电话:

w([A,B,C]), w([B,C]), alldif([A,B,C]).

现在我希望变量 A 是 [a,e,i,o,t,l] 之一。我可以这样做:

member(A, [a,e,i,o,t,l]).

但是使用约束编程是否更快(?):

A in [a,e,i,o,t,l]

all_different([A,B,C]).

我现在有点卡住了。这个想法是在 .txt 文件中逐行生成所有可能的选项。

我设法使用以下方法将单词连接成语句:

g([A,B,C], W1), g([B,C], W2), alldif([A,B,C]), buildStat([W1,W2], Statement).

地点:

g(Format, Word):-
    list_to_set(Format, Uniques),
    alldif(Uniques),
    w(Format),
    atomic_list_concat(Format, '', Atom), atom_string(Atom, Word).

insertSpaces([A], [A]).
insertSpaces([Word | Rest], OutWords):-
    insertSpaces(Rest, OutWordsRest),
    OutWords = [Word, " " | OutWordsRest].


buildStat(Words, Statement):-
    insertSpaces(Words, OutWords),
    with_output_to(atom(Statement), maplist(write, OutWords)).

但我不知道如何将所有可能的语句逐行保存到文件中。 帮助将不胜感激。

【问题讨论】:

    标签: prolog substitution constraint-programming


    【解决方案1】:

    发出所有解决方案的一个简单技巧是通过false/0强制回溯

    例如,假设你有一个谓词可以产生所有回溯解决方案:

    ?- 解决方案(S)。

    您可以发出 所有 解决方案,如下所示:

    ?- 解决方案(S), print_solution(S), 错误

    您必须在其中定义 print_solution/1 以生成所需的格式。

    例如,您可以将此类解决方案打印到标准输出,然后将输出管道 输出到文件。具体情况取决于您的 Prolog 系统,可能如下所示:

    $ prolog --goal 'ignore((solution(S),portray_clause(S),false)),halt' > output.txt

    【讨论】:

    • “false”解决了生成所有问题。你能帮我更快的吗(要请求所有不同的变量,例如指定 A 必须是 [a,e,i,o],或者首先在字典中查找单词?)
    • 请为此提出单独的问题。另外,尝试使用 time/1 来测量它所花费的时间,例如 ?- time(your_goal). 。这将帮助您找出哪种方法更快。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-20
    • 1970-01-01
    • 1970-01-01
    • 2011-05-16
    • 1970-01-01
    • 2015-07-26
    相关资源
    最近更新 更多