【问题标题】:CLP Prolog - Logic ProgrammingCLP Prolog - 逻辑编程
【发布时间】:2015-08-27 19:31:40
【问题描述】:

我们有一个列表列表,认为示例 ?- solve([[40,A,B],[30,B],[60,A,B,C]]),label([A,B,C]). 将成功替换 B=30、A=10 和 C=20。 此示例的约束条件是 A+B=40,A+B+C=60,通常每个变量都在 0 到 100 之间。每个列表都必须以常量开头,并且至少包含一个变量。

:- use_module(library(clpfd)).

sum([],0).                              % if the list is empty.
sum([X|XS],Z) :-
   sum(XS,Z1),
   X in 0..100,
   Z #= X+Z1.

solveOne([Const|Var]) :-
   sum(Var,Const). 

solve([]).                            % if the list of list is also empty
solve([First|Others]) :-
   solveOne(First),
   solve(Others).

我对基本案例和事实的想法有点怀疑。因为每个列表都必须根据约束在列表中包含一个变量,另一方面我们考虑“空列表”的情况。?

【问题讨论】:

    标签: prolog clpfd


    【解决方案1】:

    首先,显而易见的问题是:您同时定义了 solve/2solve/1 谓词 (solve([],0))。 “,0”可能不需要。

    除此之外,如果你只有一个常数,比如[X],那么只有当X 为零时,solveOne 才会成功;否则,根据sum([],0) 失败。因此,从某种意义上说,如果您假设总和始终为严格正数,则间接检查您是否可以拥有至少一个变量。

    为了明确地检查至少存在一个变量,你可以修改solveOne如下:

     solveOne([Const,V1|Vars]) :-
        sum([V1|Vars], Const).
    

    【讨论】:

      【解决方案2】:

      @coredump 的回答应该会让你走上正轨。如果您对编写精益代码感兴趣,请考虑这个更简洁的定义(在 SWI-Prolog 中测试)

      solve(L) :- maplist(solveOne, L).
      solveOne([C|Vs]) :- Vs ins 0..100, sum(Vs, #=, C).
      
      ?- solve([[40,A,B],[30,B],[60,A,B,C]]).
      A = 10,
      B = 30,
      C = 20.
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-08-11
        • 1970-01-01
        • 1970-01-01
        • 2014-12-03
        • 2023-03-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多