Prolog:为什么这个谓词找到答案却忽略了答案,然后继续与[]统一?

时间:2019-09-29 20:39:34

标签: prolog unification

我写了一个谓词,该谓词应该遍历数字列表,然后将当前数字与下一个数字进行比较,然后将较大的数字添加到应该返回的列表中。最后一个数字只是添加到列表中。

例如:

[1,2,3]应该返回[2,3,3]

[3,5,6,6,5,9]应该返回[5,6,6,6,9,9]

问题

谓词找到了答案(将答案写出了),但并没有将其统一(?)并继续返回[]

代码:

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)).

1 个答案:

答案 0 :(得分:1)

您描述的问题的解决方案是:

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

此解决方案利用第一参数索引的优势来避免虚假的选择点。