具有结构和列表的序言练习,输出奇怪

时间:2018-06-20 22:33:48

标签: prolog

这是我第一次使用序言,所以希望您能帮助我找出我在这里缺少的内容。

对于命令:

eq_multiply(equation([variable("a", 2), variable("b", 1)]), 3, MultipliedEquation).

我得到以下输出:

MultipliedEquation = equation(_2922).

相反,我需要获得以下输出:

MultipliedEquation = equation([variable(a, 6.0), variable(b, 3.0)]).

那是我的代码:

eq_multiply(equation([]), Factor, Return).
eq_multiply(equation([variable(A, X)|Tail1]), Factor, equation(List)) :-
Res is X * Factor, eq_multiply(equation(Tail1), Factor, equation([variable(A, Res)|List])).

希望您能帮助我找到我的错误, 谢谢!

1 个答案:

答案 0 :(得分:0)

假设equation/1术语的参数始终是一个列表(如您的示例中所示),您可以首先展开参数:

eq_multiply(equation(List), Factor, equation(Result)) :-
    eq_multiply_list(List, Factor, Result).

eq_multiply_list/3辅助谓词现在只需要遍历列表并对每个列表元素执行乘法运算。基本情况是当列表为空时:

eq_multiply_list([], _, []).

如果列表不为空,则处理列表的开头,然后处理列表的结尾:

eq_multiply_list([variable(A, X)| Tail1], Factor, [variable(A, Res)| Tail2]) :-
    Res is X * Factor,
    eq_multiply_list(Tail1, Factor, Tail2).

您的示例查询:

?- eq_multiply(equation([variable("a", 2), variable("b", 1)]), 3, MultipliedEquation).
MultipliedEquation = equation([variable("a", 6), variable("b", 3)]).