如何修改Prolog代码按指定数量输出对应城市地标
修改Prolog程序实现指定数量地标按序输出
现有一段Prolog程序,输入目标城市名称和想要游览的地标数量后,会输出该城市的所有地标。需要修改代码,使其按地标初始化的顺序输出用户指定数量的地标。例如输入城市为Vienna、指定数量为3时,程序应返回:Hundertwasser House, Vienna State Opera, Schonbrunn Palace.
原代码
landmark("Vienna", "Hundertwasser House"). landmark("Vienna", "Vienna State Opera"). landmark("Vienna", "Schonbrunn Palace"). landmark("Vienna", "The Hofburg"). landmark("Vienna", "Belvedere Palace"). suggest_landmark:- write('Name of the city interested in: '), nl, read(X), format('City: ~w.', [X]), nl, nl, write('Number of landmarks: '), nl, read(Y), format('Landmarks: ~w.', [Y]), nl, nl, landmark(X, Z), format('Landmarks: ~w.', [Z]), nl, fail.
修改后的代码
landmark("Vienna", "Hundertwasser House"). landmark("Vienna", "Vienna State Opera"). landmark("Vienna", "Schonbrunn Palace"). landmark("Vienna", "The Hofburg"). landmark("Vienna", "Belvedere Palace"). suggest_landmark:- write('Name of the city interested in: '), nl, read(X), format('City: ~w.', [X]), nl, nl, write('Number of landmarks: '), nl, read(Y), format('Landmarks: ~w.', [Y]), nl, nl, % 调用辅助谓词控制取地标数量 suggest_n_landmarks(X, 1, Y). % 终止条件:已取数量超过目标时停止 suggest_n_landmarks(_, Current, Target) :- Current > Target, !. % 按顺序取地标并输出,计数递增 suggest_n_landmarks(City, Current, Target) :- landmark(City, Landmark), format('~w', [Landmark]), % 处理输出分隔符:最后一个加句号,其余加逗号空格 (Current = Target -> format('.~n', []) ; format(', ', [])), Next is Current + 1, suggest_n_landmarks(City, Next, Target).
关键修改点
- 新增辅助谓词
suggest_n_landmarks/3,通过计数控制输出数量:- 第一个子句作为终止条件,当当前计数超过目标数量时,用截断符
!阻止回溯,避免遍历剩余地标。 - 第二个子句按Prolog事实定义的顺序匹配地标,输出后递归调用自身,直到达到指定数量。
- 第一个子句作为终止条件,当当前计数超过目标数量时,用截断符
- 优化输出格式,让多个地标用逗号分隔,最后一个地标后添加句号,与示例输出格式一致。
- 移除原代码中用
fail强制回溯输出所有地标的逻辑,改为计数控制终止流程。
内容的提问来源于stack exchange,提问作者leskovecg98
相关产品推荐
相关产品推荐

