【问题标题】:How can plus a list of lists in prolog?怎样才能在prolog中加一个list列表呢?
【发布时间】:2020-03-24 22:25:19
【问题描述】:

我需要一个谓词,它使用纯逻辑和自然数表示法加上序言中的列表列表。 例如谓词:

?-totalPlus([ [s(0)],[s(0),s(0)],[s(s(0))] ], Res).

结果必须是:

Res= s(s(s(s(s(0))))).

这是我的实现,但它只返回第一个列表的加号:

    plusNat(0,X,X).
    plusNat(s(X),Y,s(Z)):-plusNat(X,Y,Z).

    plusList([],0).
    plusList([X|Xs], S) :- plusList(Xs,SXs), plusNat(X,SXs,S).

    totalPlus([],_).
    totalPlus([X|Xs],Y):-totalPlus(Xs,_), plusList(X,Y).
    ------------------

    ?-totalPlus([ [s(0)],[s(0),s(0)],[s(s(0))] ], Res).
      Res= s(0).

提前致谢!

【问题讨论】:

  • 再次应用您在plusList 中使用的概念。
  • 使用另一个谓词 plusList2 例如在 plusList 中调用?
  • 是的,没错。
  • 我已经证明了,但它不起作用=(你能举个例子吗?

标签: prolog logic


【解决方案1】:

我最后添加了一个加号谓词来累积结果,这是一个可能的解决方案并且有效:

plusNat(0,X,X).
plusNat(s(X),Y,s(Z)):-plusNat(X,Y,Z).
plusList([],0).
plusList([X|Xs],S) :- plusList(Xs,SXs), plusNat(X,SXs,S).
totalPlus([],0).
totalPlus([X|Xs],Y):-totalPlus(Xs,Z), plusList(X,K), plusNat(K,Z,Y).

【讨论】:

    【解决方案2】:

    最好使用使用累加器的辅助谓词plusList/3 来实现plusList/2,例如:

    plusList(L, S) :-
        plusList(L, 0, S).
    
    plusList([], S, S).
    plusList([H|T], Si, So) :-
        plusNat(H, Si, S),
        plusList(T, S, So).
    

    好消息是,当我们将 totalPlus 的子列表的总和相加时,我们可以利用这个辅助谓词来避免重复工作:

    totalPlus(LL, S) :-
        totalPlus(LL, 0, S).
    
    totalPlus([], S, S).
    totalPlus([H|T], Si, So) :-
        plusList(H, Si, S),
        totalPlus(T, S, So).
    

    【讨论】:

      猜你喜欢
      • 2019-11-04
      • 1970-01-01
      • 2014-03-20
      • 2020-12-19
      • 1970-01-01
      • 2021-08-03
      • 2021-01-14
      • 1970-01-01
      相关资源
      最近更新 更多