【问题标题】:swi Prolog - Error arguments not sufficiently Instantiatedswi Prolog - 错误参数没有充分实例化
【发布时间】:2014-02-17 23:47:33
【问题描述】:

我是 Prolog 的新手,当我查询时 sortedUnion([1,1,1,2,3,4,4,5], [0,1,3,3,6,7], [0,1,2,3,4,5,6,7]). 我收到一个错误

Exception: (7) unite([_G114, _G162, _G201, _G231, _G243], [_G249, _G297, _G336, _G357, _G369], [0, 1, 2, 3, 4, 5, 6, 7]) ?

所以我希望有人能够告诉我我的代码在哪里出错以及为什么出错?

%undup(L, U) holds precisely when U can be obtained from L by eliminating repeating occurrences of the same element                   
undup([], []).
undup([X|Xs], [_|B]) :- remove(X,Xs,K), undup(K, B).

remove(_,[],[]).
remove(Y,[Y|T],D) :- remove(Y,T,D).
remove(Y,[S|T],[S|R]) :- not(Y = S), remove(Y,T,R).

%sortedUnion(L1,L2,U) holds when U contains exactly one instance of each element 
%of L1 and L2

sortedunion([H|T], [S|R], [F|B]) :- undup([H|T], N), undup([S|R], M), unite(N,M,[F|B]).
unite([], [], []).
unite([X], [], [X]).
unite([], [X], [X]).
unite([H|T], [S|R], [X|Xs]) :- S=H, X is S, unite(T, R, Xs).
unite([H|T], [S|R], [X|Xs]) :- H<S, X is H, unite(T, [S|R], Xs).
unite([H|T], [S|R], [X|Xs]) :- S<H, X is S, unite([H|T], R, Xs).

【问题讨论】:

    标签: prolog instantiation-error


    【解决方案1】:

    首先是一个建议:尽量让您的代码尽可能简单。你的代码可以减少到这个(这肯定有效)

    sortedunion(A, B, S) :-
        append(A, B, C),
        sort(C, S).
    

    当然,尝试自己解决是有益的。无论如何,尽量避免无用的并发症。

    sortedunion(A, B, S) :-
     undup(A, N),
     undup(B, M),
     unite(N, M, S).
    

    它相当于你的代码,只是更简单,因为A = [H|T]等等。

    然后测试undup/2:

    1 ?- undup([1,1,1,2,3,4,4,5],L).
    L = [_G2760, _G2808, _G2847, _G2877, _G2889] ;
    false.
    

    显然,这不是您所期望的。罪魁祸首应该是anon var。确实,这行得通:

    undup([], []).
    undup([X|Xs], [X|B]) :- remove(X,Xs,K), undup(K, B).
    
    2 ?- undup([1,1,1,2,3,4,4,5],L).
    L = [1, 2, 3, 4, 5] ;
    false.
    

    现在,团结起来/3。首先,is/2 被滥用。它介绍了算术,然后在这里简单的统一就足够了:X = S

    然后,基本情况被硬编码以在列表长度最多相差 1 的情况下工作。同样,更简单的代码应该更好地工作:

    unite([], [], []).
    unite( X, [],  X).
    unite([],  X,  X).
    ...
    

    另外,请注意第一个子句是无用的,已经被(两个)第二个和第三个子句覆盖了。

    【讨论】:

    • 有一个作业指南不使用任何我们在课堂上没有讨论过的预定义谓词。我现在意识到我不应该使用'_'是多么明显。
    猜你喜欢
    • 2012-07-26
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多