Prolog:为什么这个谓词找到答案但忽略它并继续与 [] 统一?
Prolog: why this predicate finds the answer but ignores it and goes on to unify with []?
我写了一个谓词,它应该遍历一个数字列表并将当前数字与下一个数字进行比较,然后将较大的数字添加到它应该 return 的列表中。最后一个数字只是添加到列表中。
例如:
[1,2,3]
应该 return [2,3,3]
[3,5,6,6,5,9]
应该 return [5,6,6,6,9,9]
问题
谓词找到了答案(它写出来了),但它没有统一(?)它并继续 return []
.
代码:
head([H|_], H).
head([],[]).
maximize([], X) :- write(X).
maximize([H|T], X) :-
(head(T, N), N = []) -> (append(X, [H], L), maximize([], L)) ;
(head(T, N), H < N) -> (append(X, [N], L), maximize(T, L)) ; (append(X, [H], L), maximize(T, L)).
您描述的问题的解决方案是:
maximize([], []).
maximize([X| Xs], M) :-
maximize(Xs, X, M).
maximize([], X, [X]).
maximize([Y| Ys], X, M) :-
( Y > X ->
M = [Y| T]
; M = [X| T]
),
maximize(Ys, Y, T).
调用示例:
| ?- maximize([1,2,3], M).
M = [2,3,3]
yes
| ?- maximize([3,5,6,6,5,9], M).
M = [5,6,6,6,9,9]
yes
此解决方案利用第一个参数索引来避免虚假选择点。
我写了一个谓词,它应该遍历一个数字列表并将当前数字与下一个数字进行比较,然后将较大的数字添加到它应该 return 的列表中。最后一个数字只是添加到列表中。
例如:
[1,2,3]
应该 return [2,3,3]
[3,5,6,6,5,9]
应该 return [5,6,6,6,9,9]
问题
谓词找到了答案(它写出来了),但它没有统一(?)它并继续 return []
.
代码:
head([H|_], H).
head([],[]).
maximize([], X) :- write(X).
maximize([H|T], X) :-
(head(T, N), N = []) -> (append(X, [H], L), maximize([], L)) ;
(head(T, N), H < N) -> (append(X, [N], L), maximize(T, L)) ; (append(X, [H], L), maximize(T, L)).
您描述的问题的解决方案是:
maximize([], []).
maximize([X| Xs], M) :-
maximize(Xs, X, M).
maximize([], X, [X]).
maximize([Y| Ys], X, M) :-
( Y > X ->
M = [Y| T]
; M = [X| T]
),
maximize(Ys, Y, T).
调用示例:
| ?- maximize([1,2,3], M).
M = [2,3,3]
yes
| ?- maximize([3,5,6,6,5,9], M).
M = [5,6,6,6,9,9]
yes
此解决方案利用第一个参数索引来避免虚假选择点。