首页 > 解决方案 > 我不能在 SWI-Prolog 中递归调用谓词

问题描述

您好,我正在 SWI-Prolog 中编写一些代码来解决填字游戏,并且由于某种原因,谓词“do_something”失败了。谓词do_something_else(crss(...), +Q, -L).工作正常。谓词do_something(crss(...), +L1, -Lout).应该递归地添加来自 L1 和列表 L 的元素,由谓词 do_something_else 返回到“Lout”列表,但由于某种原因它返回 false。我可能应该提到 L 是一个原子列表,而 L1 是一个字符数组。该程序应该解决填字游戏。cross是一个包含整个填字游戏大小的结构,一个包含所有问题的列表,它们的坐标和应该留空的空间,以及它们的坐标。此结构中的最后一个列表存储所有可能的答案。Q只是问题的文本,没有坐标,并且L是输出列表。 space_length(+crss(...), +Q, -Len)返回问题可用于答案的空格数。 questions(crss(...), -LI)返回一个包含所有问题及其起始坐标的列表。 questions_text(+LI, -LIT)返回一个仅包含问题文本的列表。这部分代码应该返回填字游戏的所有问题以及可能的答案列表。输出示例:

('Afirmativ', [['D', 'A'], ['N', 'U']])
('Negativ', [['D', 'A'], ['N', 'U']]).

 do_something_else(crss(_, _, _, []), _, []).
 do_something_else(crss(_, _, PL, [H | T]), Q, [CL | L]) :-space_length(crss(_, _, PL, _), Q, Len), atom_chars(H, CL), length(CL, Ln), Ln == Len, !, do_something_else(crss(_, _, PL, T), Q, L).
 do_something_else(crss(_, _, PL, [H | T]),Q, L) :- space_length(crss(_, _, PL, _), Q, Len), atom_chars(H, CL), length(CL, Ln), Ln =\= Len, do_something_elese(crss(_, _, PL, T), Q, L).

 do_something(crss(_, _, _, []), [], []).
 do_something(crss(_, _, PL, V), [H | T], [(H, L) |List]) :- do_something_else(crss(_, _, PL, V), H, L), X(crss(_, _, PL, V), T, List).

 pos_sol(crss(_, _, _, []), []).
 pos_sol(crss(_, _, PL, V), List) :- questions(crss(_, _, PL, _), LI), questions_text(LI, LIT), do_something(crss(_, _, PL, V), LIT, List).

标签: listrecursionprolog

解决方案


推荐阅读