【问题标题】:Prolog: why this predicate finds the answer but ignores it and goes on to unify with []?Prolog:为什么这个谓词找到了答案却忽略了它并继续与[]统一?
【发布时间】:2020-01-29 05:23:35
【问题描述】:

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

例如:

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

【问题讨论】:

    标签: prolog unification


    【解决方案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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多