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

Visual Prolog 5.2实现两列表生成加法表达式列表的问题求助

Visual Prolog 5.2 生成加法表达式列表问题解决

你当前的代码会直接计算X+Y的算术结果,因为第三个参数被定义为整数列表,Visual Prolog会自动求值整数运算。要保留X+Y形式的表达式,需要调整域定义,让结果列表能存储表达式结构而非单纯的整数。

原始问题代码

domains
i=integer
il=i*
predicates
f(il,il,il)
clauses
f([],_,[]):-!.
f(_,[],[]):-!.
f([X|T1],[Y|T2],[Z|T3]):-Z=X+Y,f(T1,T2,T3).
goal
f([1,3,5,7],[2,4,6,8,10,12],R).

修改方案

1. 调整域定义,支持表达式结构

新增一个expr域,用来容纳整数或加法表达式结构,同时把结果列表的类型从整数列表改为表达式列表:

domains
    i = integer
    % 定义表达式类型:要么是整数,要么是两个整数的加法结构
    expr = i; add(i, i)
    il = i*
    expr_list = expr*

2. 修改谓词参数与子句

将第三个参数的类型改为expr_list,并直接存储加法结构add(X,Y)而非计算结果:

predicates
    f(il, il, expr_list)
clauses
    f([], _, []):-!.
    f(_, [], []):-!.
    f([X|T1], [Y|T2], [add(X,Y)|T3]):- 
        f(T1, T2, T3).

此时执行目标f([1,3,5,7],[2,4,6], X),得到的X会是[add(1,2), add(3,4), add(5,6)],这就是保留了加法逻辑的表达式结构。

3. 可选:转换为"X+Y"字符串形式

如果需要得到["1+2", "3+4", "5+6"]这样的字符串列表,可以添加辅助谓词实现表达式到字符串的转换:

predicates
    expr_to_string(expr, string)
    map_expr_to_string(expr_list, string*)
clauses
    % 整数转字符串
    expr_to_string(N, S):- 
        integer(N), 
        string_int(S, N).
    % 加法结构转字符串
    expr_to_string(add(A,B), S):-
        expr_to_string(A, S1),
        expr_to_string(B, S2),
        string_concat(S1, "+", Temp),
        string_concat(Temp, S2, S).
    
    % 批量转换表达式列表为字符串列表
    map_expr_to_string([], []).
    map_expr_to_string([E|Es], [S|Ss]):-
        expr_to_string(E, S),
        map_expr_to_string(Es, Ss).

执行目标:

goal
    f([1,3,5,7],[2,4,6], ExprList),
    map_expr_to_string(ExprList, X).

此时X的值就是["1+2", "3+4", "5+6"],符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 21:40:57