You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Turbo Prolog需求:添加最少字符将列表转换为回文

最少字符扩展列表为回文的Turbo Prolog实现

现有一段Turbo Prolog代码可将输入列表转换为回文,但当前实现会添加多余字符(直接拼接整个列表的反转),不符合添加最少字符生成回文的需求。例如输入[1, 2, 3, 4, 3],期望输出[1, 2, 3, 4, 3, 2, 1],而非冗余的[1,2,3,4,3,3,4,3,2,1]。

原实现代码

domains
  list = integer*
 
predicates
  readlist(list).
  extend_to_palindrome(list, list).
  reverse(list, list).
  append(list, list, list).
  suffix(list, list).
 
clauses
  readlist([Head|Tail]) :- 
    readint(Head), !,
    readlist(Tail).
  readlist([]).
 
  reverse([], []).
  reverse([H|T], Reversed) :- 
    reverse(T, ReversedTail),
    append(ReversedTail, [H], Reversed).
 
  append([], List, List).
  append([H|T], List2, [H|Result]) :- 
    append(T, List2, Result).
 
  suffix(List, Suffix) :- 
    append([], Suffix, List).
 
  extend_to_palindrome(List, Result) :- 
    suffix(List, Suffix),
    reverse(Suffix, [_|TrimmedReversedSuffix]),
    append(List, TrimmedReversedSuffix, Result).
 
goal
  write("Enter elements: "), nl,
  readlist(List),
  extend_to_palindrome(List, Palindrome),
  write("Palindrome: "), write(Palindrome), nl.

原代码问题分析

  1. suffix谓词定义错误:当前实现等价于suffix(List, List),无法获取列表的真后缀(末尾子序列)。
  2. extend_to_palindrome逻辑错误:没有找到列表中最长的回文后缀,而是直接处理整个列表,导致添加多余字符。

修改后的实现代码

domains
  list = integer*
 
predicates
  readlist(list).
  extend_to_palindrome(list, list).
  reverse(list, list).
  append(list, list, list).
  suffix(list, list).
  is_palindrome(list).
 
clauses
  readlist([Head|Tail]) :- 
    readint(Head), !,
    readlist(Tail).
  readlist([]).
 
  reverse([], []).
  reverse([H|T], Reversed) :- 
    reverse(T, ReversedTail),
    append(ReversedTail, [H], Reversed).
 
  append([], List, List).
  append([H|T], List2, [H|Result]) :- 
    append(T, List2, Result).
 
  % 修正:正确获取列表的所有后缀(包括自身)
  suffix(List, Suffix) :- 
    append(_, Suffix, List).
 
  % 判断列表是否为回文
  is_palindrome(List) :-
    reverse(List, List).
 
  % 核心逻辑:找到最长的回文后缀,将前缀反转后拼接
  extend_to_palindrome(List, Result) :-
    suffix(List, Suffix),
    is_palindrome(Suffix),
    append(Prefix, Suffix, List),
    reverse(Prefix, ReversedPrefix),
    append(List, ReversedPrefix, Result),
    !. % 截断回溯,确保只取最长回文后缀的解
 
goal
  write("输入元素: "), nl,
  readlist(List),
  extend_to_palindrome(List, Palindrome),
  write("生成的回文: "), write(Palindrome), nl.

关键修改说明

  1. 修正suffix谓词:通过append(_, Suffix, List)实现,能生成列表的所有可能后缀(从整个列表到最后一个元素)。
  2. 新增is_palindrome谓词:通过判断列表与其反转是否相等,确认是否为回文。
  3. 重构extend_to_palindrome逻辑:
    • 遍历列表的所有后缀,找到最长的回文后缀;
    • 拆分原列表为前缀 + 最长回文后缀;
    • 将前缀反转后拼接到原列表末尾,得到添加字符最少的回文。

内容的提问来源于stack exchange,提问作者zvezdniylord

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 22:13:16