【问题标题】:Learning Prolog : solving crossword problem in prolog学习Prolog:解决prolog中的填字游戏问题
【发布时间】:2021-05-11 10:34:51
【问题描述】:

我正在尝试学习 Prolog,我有一个练习,但我无法解决它。 这是我必须做的:-

https://i.stack.imgur.com/CSJqK.png

这是我尝试过的代码:-

word(zombifies, [z,o,m,b,i,f,i,e,s]).
word(akecabele, [a,k,e,c,a,b,e,l,e]).
word(brickwork, [b,r,i,c,k,w,o,r,k]).
word(backcheck, [b,a,c,k,c,h,e,c,k]).
word(acmrremad, [a,c,m,r,r,e,m,a,d]).
word(nhgwpfabz, [n,h,g,w,p,f,a,b,z]).
word(jellybean, [j,e,l,l,y,b,e,a,n]).
word(aerreoded, [a,e,r,r,e,o,d,e,d]).

crossword(H1,H2,H3,H4,V1,V2,V3,V4):-
    word(H1, [_,H1V1,_,H1V2,_,H1V3,_,H1V4,_]),
    word(H2, [_,H2V1,_,H2V2,_,H2V3,_,H2V4,_]),
    word(H3, [_,H3V1,_,H3V2,_,H3V3,_,H3V4,_]),
    word(H4, [_,H4V1,_,H4V2,_,H4V3,_,H4V4,_]),

    word(V1, [_,H1V1,_,H2V1,_,H3V1,_,H4V1,_]),
    word(V2, [_,H1V2,_,H2V2,_,H3V2,_,H4V2,_]),
    word(V3, [_,H1V3,_,H2V3,_,H3V3,_,H4V3,_]),
    word(V4, [_,H1V4,_,H2V4,_,H3V4,_,H4V4,_]),
H1\=V1,
H2\=V2,
H3\=V3,
H4\=V4.

但当我运行此代码时,它总是返回 false。 那么我可以做些什么来修改此代码以正确运行?

编辑 这张图片中有这个问题的最终解决方案:- https://i.stack.imgur.com/0QiEw.png

【问题讨论】:

  • 是什么让您认为解决方案?
  • 我编辑了问题
  • 你的“解决方案”使用了“earreoded”这个词,这不是你们的一个词。
  • 不,我在我的代码中使用了它,它在我上传的图片中的 V2 中找到,所以它在我的代码和解决方案中

标签: prolog


【解决方案1】:

您的代码找不到解决方案,因为没有包含单词 aerreoded 的解决方案。但是,当单词集合中包含单词earreoded时,可以找到两种解决方案。

word(zombifies, [z,o,m,b,i,f,i,e,s]).
word(akecabele, [a,k,e,c,a,b,e,l,e]).
word(brickwork, [b,r,i,c,k,w,o,r,k]).
word(backcheck, [b,a,c,k,c,h,e,c,k]).
word(acmrremad, [a,c,m,r,r,e,m,a,d]).
word(nhgwpfabz, [n,h,g,w,p,f,a,b,z]).
word(jellybean, [j,e,l,l,y,b,e,a,n]).
word(aerreoded, [a,e,r,r,e,o,d,e,d]).
word(earreoded, [e,a,r,r,e,o,d,e,d]). % include this new word!

crossword(H1,H2,H3,H4,V1,V2,V3,V4):-
    word(H1, [_,H1V1,_,H1V2,_,H1V3,_,H1V4,_]),
    word(H2, [_,H2V1,_,H2V2,_,H2V3,_,H2V4,_]),
    word(H3, [_,H3V1,_,H3V2,_,H3V3,_,H3V4,_]),
    word(H4, [_,H4V1,_,H4V2,_,H4V3,_,H4V4,_]),
    word(V1, [_,H1V1,_,H2V1,_,H3V1,_,H4V1,_]),
    word(V2, [_,H1V2,_,H2V2,_,H3V2,_,H4V2,_]),
    word(V3, [_,H1V3,_,H2V3,_,H3V3,_,H4V3,_]),
    word(V4, [_,H1V4,_,H2V4,_,H3V4,_,H4V4,_]),
    H1 \= V1,
    H2 \= V2,
    H3 \= V3,
    H4 \= V4.

运行示例:

?- crossword(H1,H2,H3,H4,V1,V2,V3,V4).
H1 = backcheck,
H2 = brickwork,
H3 = zombifies,
H4 = jellybean,
V1 = earreoded,
V2 = akecabele,
V3 = nhgwpfabz,
V4 = acmrremad ;
H1 = earreoded,
H2 = akecabele,
H3 = nhgwpfabz,
H4 = acmrremad,
V1 = backcheck,
V2 = brickwork,
V3 = zombifies,
V4 = jellybean ;
false.

如您所见,没有找到包含单词aerreoded 的解决方案。

改进版

您可以通过重新排序谓词 crossword/8 定义中的条件来使您的代码运行得更快,以便尽早发生故障(这将减少找到答案所需的回溯/推理的数量)。

faster_crossword(H1,H2,H3,H4,V1,V2,V3,V4):-
    word(H1, [_,H1V1,_,H1V2,_,H1V3,_,H1V4,_]),
    word(V1, [_,H1V1,_,H2V1,_,H3V1,_,H4V1,_]),
    H1 \= V1,
    word(H2, [_,H2V1,_,H2V2,_,H2V3,_,H2V4,_]),
    word(V2, [_,H1V2,_,H2V2,_,H3V2,_,H4V2,_]),
    H2 \= V2,
    word(H3, [_,H3V1,_,H3V2,_,H3V3,_,H3V4,_]),
    word(V3, [_,H1V3,_,H2V3,_,H3V3,_,H4V3,_]),
    H3 \= V3,
    word(H4, [_,H4V1,_,H4V2,_,H4V3,_,H4V4,_]),
    word(V4, [_,H1V4,_,H2V4,_,H3V4,_,H4V4,_]),
    H4 \= V4.

要比较两个版本,您可以使用forall/2(生成所有解决方案)和time/1(打印运行时间统计信息)。

经验结果:

?- time(forall(crossword(H1,H2,H3,H4,V1,V2,V3,V4), writeln([H1,H2,H3,H4,V1,V2,V3,V4]))).
[backcheck,brickwork,zombifies,jellybean,earreoded,akecabele,nhgwpfabz,acmrremad]
[earreoded,akecabele,nhgwpfabz,acmrremad,backcheck,brickwork,zombifies,jellybean]
% 7,411 inferences, 0.000 CPU in 0.000 seconds (?% CPU, Infinite Lips)
true.

?- time(forall(faster_crossword(H1,H2,H3,H4,V1,V2,V3,V4), writeln([H1,H2,H3,H4,V1,V2,V3,V4]))).
[backcheck,brickwork,zombifies,jellybean,earreoded,akecabele,nhgwpfabz,acmrremad]
[earreoded,akecabele,nhgwpfabz,acmrremad,backcheck,brickwork,zombifies,jellybean]
% 48 inferences, 0.000 CPU in 0.000 seconds (?% CPU, Infinite Lips)
true.

【讨论】:

  • 我也试过这段代码并返回 false 它不返回任何解决方案它只返回 false
  • 这听起来很奇怪...此代码与 SWI-Prolog 编译器完美配合!你用的是什么编译器?
  • 我也在使用 SWI-Prolog,我在扩展名为 .pl 的文件中编写了一个代码,然后用 SWI-Prolog 打开它并在编译器中写入函数名称。
  • 也许您调用谓词的方式错误...您必须将源代码复制并粘贴到编辑器中,保存并编译。之后,您必须在系统提示符 (?- ) 中复制并粘贴谓词调用(查询)。你这样做吗?
  • 是的,我就是这么做的。在我的编辑器中编写代码,保存并使用 SWI-Prolog 打开 pl 文件,并在提示符中写入函数名称及其参数
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多