Prolog 将整数表示形式更改为另一个基
我对序言很陌生 我在大学课堂上做了一个令人讨厌的开场白练习 我需要编写一个程序,得到一个prolog术语和一个基数,然后它将术语中的所有整数转换成这个基数 例如:Prolog 将整数表示形式更改为另一个基,prolog,Prolog,我对序言很陌生 我在大学课堂上做了一个令人讨厌的开场白练习 我需要编写一个程序,得到一个prolog术语和一个基数,然后它将术语中的所有整数转换成这个基数 例如: ?- change_base(g(7), 2, Result). Result = g(111). 我写了这个程序,但似乎我得到了一个无休止的循环: change_base([], _, []). change_base([X|Xs], Base, [X1|NewTermAsList]) :- integer(X),
?- change_base(g(7), 2, Result).
Result = g(111).
我写了这个程序,但似乎我得到了一个无休止的循环:
change_base([], _, []).
change_base([X|Xs], Base, [X1|NewTermAsList]) :-
integer(X), !, (calc_base(X,Base,X1), change_base(Xs,Base,NewTermAsList)).
change_base([X|Xs], Base, [X1|NewTermAsList]) :-
change_base(Xs,Base,NewTermAsList).
change_base(Term, Base, NewTerm) :-
Term =..TermAsList, change_base(TermAsList, Base, NewTermAsList),
NewTerm =..NewTermAsList.
calc_base(0, Base, 0).
calc_base(Num, Base, Res) :-
Num > 0, Mod is Num mod Base, Div is Num // Base,
calc_base(Div, Base, Res1), Res is Res1 * 10 + Mod.
我在用阿姆齐!序言
谢谢,重新编写代码以修复问题:
change_base(Term, Base, NewTerm) :-
nonvar(Term),
Term =.. Arguments,
change_arguments_base(Arguments, Base, NewArguments),
NewTerm =.. NewArguments.
change_arguments_base([], _, []).
change_arguments_base([Argument| Arguments], Base, [NewArgument| NewArguments]) :-
( integer(Argument) ->
calc_base(Argument, Base, NewArgument)
; compound(Argument) ->
change_base(Argument, Base, NewArgument)
; NewArgument = Argument
),
change_arguments_base(Arguments, Base, NewArguments).
calc_base(0, _, 0) :-
!.
calc_base(Num, Base, Res) :-
Num > 0, Mod is Num mod Base, Div is Num // Base,
calc_base(Div, Base, Res1), Res is Res1 * 10 + Mod.
电话样本:
?- change_base(g(7,4), 2, Result).
Result = g(111, 100).
?- change_base(4, 2, Result).
Result = 100.
?- change_base(4.7, 2, Result).
Result = 4.7.
在你的第三句中,
X1
应该是X
。您还需要在该子句中进行剪切,以便仅当第一个参数不是列表时才使用第四个子句。