【问题标题】:Prolog checking if two lists are identicalProlog 检查两个列表是否相同
【发布时间】:2016-12-01 01:07:36
【问题描述】:

所以我需要编写一个名为doubleAll7/2 的序言词,它需要两个列表。如果对于第一个列表中出现的每一个 7,第二个列表连续有两个 7,则程序返回 true。 示例doubleAll7([1,7,1],[1,7,7,1]) 为真,但doubleAll7([1,2,7],[1,2,7]) 为假。

double7/2 将列表中所有出现的 7 加倍,并且完美运行。

由于某种原因,这个程序总是返回 false。

    doubleAll7([H1|T1],[H2,T2]) :-
    double7([H1|T1], L),
        L == [H2|T2].

    double7([],[]).
    double7([H|T], [H,H|Z]) :-
    H is 7,
    !,
    double7(T,Z).
    double7([H|T], [H|Z]) :-
    double7(T,Z).

【问题讨论】:

    标签: prolog


    【解决方案1】:

    有一个明显的错误:第一行

    doubleAll7([H1|T1],[H2,T2])
    

    应该是

    doubleAll7([H1|T1],[H2|T2])
    

    我的意思是:| 代替 , 作为 H2T2 之间的分隔符

    但是,抱歉:我发现您的解决方案过于复杂。

    你可以避免double7/2(你对double7的调用是没有用的,因为如果我没记错的话,它相当于

    doubleAll7(L1, L2) :-
      double7(L1, L2).
    

    ),你可以避免is/2,你可以避免!,你可以全部简化为

    doubleAll7([], []).
    
    doubleAll7([7 | T1], [7, 7 | T2]) :-
      doubleAll7(T1, T2).
    
    doubleAll7([H | T1], [H | T2]) :-
      H \== 7,
      doubleAll7(T1, T2).
    

    【讨论】:

    • 哦,天哪,修复了它......之前已经犯了好几次这个错误,当我修复它时它不起作用。一定是又把它解开了,我什么时候做对了也说不出来
    • @user237083 - 我知道...我是处理此类错误的专家。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-25
    • 1970-01-01
    • 2012-01-10
    • 2013-04-16
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    相关资源
    最近更新 更多