【问题标题】:Member predicate issues, change for a dollar会员谓词问题,换一美元
【发布时间】:2012-12-11 22:56:03
【问题描述】:

我完全是 Prolog 的菜鸟。我正在做一个任务,我创建一个零钱计数器,总共可以取S(以美分为单位),0

这是我的代码:

change(S,H,Q,D,N,P) :-
            member(H,[0,1,2]),      /* Half-dollars */      
            member(Q,[0,1,2,3,4]),  /* quarters */  
            member(D,[0,1,2,3,4,5,6,7,8,9,10]) ,    /* dimes */    
            member(N,[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]), 
            /* ^^ nickels ^^ */

            S is 50*H + 25*Q +10*D + 5*N,
            S =< 100,
            P is 100-S.

所以我的问题是,当我尝试计算 ?- change(87,0,3,D,1,P). 之类的东西时,我输入的金额是 87 美分,我需要 3 个季度和 1 个镍.....我收到一条错误消息,指出 uncaught exception: error(existence_error(procedure,change/6),top_level/0)

在最后 3 行代码中,我认为我正确处理了给定的金额。我需要对给定的金额制定额外的规则吗?

【问题讨论】:

    标签: prolog declarative


    【解决方案1】:

    你错过了美分!我建议使用 between/3 来表示范围:

    ...,
    between(0,100,Cents),
    ...,
    
    ...,
    S is 50*H + 25*Q +10*D + 5*N + Cents,
    ...,
    

    测试:

    ?- change(87,H,Q,D,N,Cents,P).
    H = Q, Q = D, D = N, N = 0,
    Cents = 87,
    P = 13 ;
    H = Q, Q = D, D = 0,
    N = 1,
    Cents = 82,
    P = 13 ;
    

    WRT error(existence_error... 我认为你需要编译你的脚本...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-24
      相关资源
      最近更新 更多