prolog max_min_eval/2 解决问题
prolog max_min_eval/2 solution issue
我想创建一个谓词 max_min_eval/2 或 max_min_eval(List,Result) 读取一个像这样列出 [1,min,2,max,4,max,3] -> (((1 min 2) max 4) max 3) 在eclipse prolog中并把结果变成一个变量。我该怎么做?
这是我的代码:
%% seperate_lists/3
%% seperate_lists(List,Lets,Nums)
seperate_lists([], [], []) .
seperate_lists([X|Xs] , [X|Lets] , Nums) :-
not(number(X)),
!,
seperate_lists(Xs,Lets,Nums).
seperate_lists( [X|Xs] , Lets, [X|Nums] ) :-
number(X),
!,
seperate_lists(Xs,Lets,Nums).
seperate_lists([_|Xs], Lets, Nums) :-
seperate_lists(Xs,Lets,Nums).
%% max_min_eval/2
%% max_min_eval(List,Result)
max_min_eval_aux(_,[Result],Result).
max_min_eval_aux(Lets, Nums, Result) :-
[LH|LT] = Lets,
[NH1,NH2|NT] = Nums,
(
('max' = LH, max(NH1,NH2,Result), append([Result],NT,NewNums), NewLets = LT, max_min_eval_aux(NewLets,NewNums,Result));
('min' = LH, min(NH1,NH2,Result), append([Result],NT,NewNums), NewLets = LT, max_min_eval_aux(NewLets,NewNums,Result))
).
max_min_eval(List,Result) :-
seperate_lists(List,Lets,Nums),
max_min_eval_aux(Lets,Nums,Result).
问题是它不适用于 ?- max_min_eval([1,max,10,min,2],Result)
,仅适用于这样的 3 元素列表 ?- max_min_eval([1,max,4],Result)
或 ?- max_min_eval([2,min,5],Result)
你可以贪婪地计算表达式:
max_min_eval([First|Tail], Res):-
max_min_eval(Tail, First, Res).
max_min_eval([],Res, Res).
max_min_eval([Op, R|Tail], L, Res):-
max_min_eval_op(Op, L, R, L1),
max_min_eval(Tail, L1, Res).
max_min_eval_op(max, L, R, Res):-
max(L, R, Res).
max_min_eval_op(min, L, R, Res):-
min(L, R, Res).
如果您的 prolog 处理器没有 max/3
和 min/3
:
,请添加这些程序
max(A,B,M):- M is max(A,B).
min(A,B,M):- M is min(A,B).
样本运行:
?- max_min_eval([1,min,2,max,4,max,3], R).
R = 4.
我想创建一个谓词 max_min_eval/2 或 max_min_eval(List,Result) 读取一个像这样列出 [1,min,2,max,4,max,3] -> (((1 min 2) max 4) max 3) 在eclipse prolog中并把结果变成一个变量。我该怎么做?
这是我的代码:
%% seperate_lists/3
%% seperate_lists(List,Lets,Nums)
seperate_lists([], [], []) .
seperate_lists([X|Xs] , [X|Lets] , Nums) :-
not(number(X)),
!,
seperate_lists(Xs,Lets,Nums).
seperate_lists( [X|Xs] , Lets, [X|Nums] ) :-
number(X),
!,
seperate_lists(Xs,Lets,Nums).
seperate_lists([_|Xs], Lets, Nums) :-
seperate_lists(Xs,Lets,Nums).
%% max_min_eval/2
%% max_min_eval(List,Result)
max_min_eval_aux(_,[Result],Result).
max_min_eval_aux(Lets, Nums, Result) :-
[LH|LT] = Lets,
[NH1,NH2|NT] = Nums,
(
('max' = LH, max(NH1,NH2,Result), append([Result],NT,NewNums), NewLets = LT, max_min_eval_aux(NewLets,NewNums,Result));
('min' = LH, min(NH1,NH2,Result), append([Result],NT,NewNums), NewLets = LT, max_min_eval_aux(NewLets,NewNums,Result))
).
max_min_eval(List,Result) :-
seperate_lists(List,Lets,Nums),
max_min_eval_aux(Lets,Nums,Result).
问题是它不适用于 ?- max_min_eval([1,max,10,min,2],Result)
,仅适用于这样的 3 元素列表 ?- max_min_eval([1,max,4],Result)
或 ?- max_min_eval([2,min,5],Result)
你可以贪婪地计算表达式:
max_min_eval([First|Tail], Res):-
max_min_eval(Tail, First, Res).
max_min_eval([],Res, Res).
max_min_eval([Op, R|Tail], L, Res):-
max_min_eval_op(Op, L, R, L1),
max_min_eval(Tail, L1, Res).
max_min_eval_op(max, L, R, Res):-
max(L, R, Res).
max_min_eval_op(min, L, R, Res):-
min(L, R, Res).
如果您的 prolog 处理器没有 max/3
和 min/3
:
max(A,B,M):- M is max(A,B).
min(A,B,M):- M is min(A,B).
样本运行:
?- max_min_eval([1,min,2,max,4,max,3], R).
R = 4.