list - 我不能在 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).
解决方案
推荐阅读
- python - 用 numpy 计算矩阵乘积
- powershell - SCVMM Powershell 限制最大数量
- php - 从另一个 php 文件的文本框中的 php 文件执行函数
- checkbox - *ngFor 循环中的 Angular 5 Checkbox 并获取选中和未选中的特定复选框
- android - 测试写权限的地方
- php - 我在 codeginter 中的 ajax 或 jquery 中的问题
- php - 无法找到 PHPunit phar。检查 php 单元配置:eclipse 氧气
- python - 无法在 docker 容器中使用 coinbase API
- ravendb - 在 RavenDB v4 中获取匹配的文本
- python - 使用 append 从另一个列表生成一个简单列表