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
相关产品推荐
相关产品推荐

