List 子集和序言
定义一个谓词子集(L,Sum,Subl),它接受一个数字列表L,一个数字和,并将Subl与一个L的子序列统一起来,这样Subl中的数字和就是Sum 比如说List 子集和序言,list,prolog,sum,subset,subset-sum,clpfd,swi-prolog,List,Prolog,Sum,Subset,Subset Sum,Clpfd,Swi Prolog,定义一个谓词子集(L,Sum,Subl),它接受一个数字列表L,一个数字和,并将Subl与一个L的子序列统一起来,这样Subl中的数字和就是Sum 比如说 ?- subsetsum([1,2,5,3,2], 5, SubSet); SubSet = [1,2,2]; SubSet = [2,3]; SubSet = [5]; SubSet = [3,2]; No. 我们有 sum([H1 | [H2 | Tail]], S):- sum([[H1+
?- subsetsum([1,2,5,3,2], 5, SubSet);
SubSet = [1,2,2];
SubSet = [2,3];
SubSet = [5];
SubSet = [3,2];
No.
我们有
sum([H1 | [H2 | Tail]], S):-
sum([[H1+H2]|Tail], S):-
sum([X], X).
及
下列条款应满足您的需要
subsetsum(SET, SUM, ANSWER) :-
% Find a subset
subset(SET, ANSWER),
% Check elements of the subset add up to SUM
sum(ANSWER, SUM).
% sum(LIST, SUM) - sums all numbers in the list
sum([], 0).
sum([X | T], SUM) :-
sum(T, TAILSUM),
SUM is TAILSUM + X.
% subset - finds subsets
subset([], []).
subset([E|Tail], [E|NTail]) :-
subset(Tail, NTail).
subset([_|Tail], NTail) :-
subset(Tail, NTail).
下列条款应满足您的需要
subsetsum(SET, SUM, ANSWER) :-
% Find a subset
subset(SET, ANSWER),
% Check elements of the subset add up to SUM
sum(ANSWER, SUM).
% sum(LIST, SUM) - sums all numbers in the list
sum([], 0).
sum([X | T], SUM) :-
sum(T, TAILSUM),
SUM is TAILSUM + X.
% subset - finds subsets
subset([], []).
subset([E|Tail], [E|NTail]) :-
subset(Tail, NTail).
subset([_|Tail], NTail) :-
subset(Tail, NTail).
使用,我们可以将库谓词
与您已经获得的子集/2
一起使用!注意,我给了subset/2
一个更合适的名称list\u subsequence/2
:
list_subsequence([], []).
list_subsequence([X|Xs], [X|Ys]) :-
list_subsequence(Xs, Ys).
list_subsequence([_|Xs], Ys) :-
list_subsequence(Xs, Ys).
subsetsum(List, Sum, Sub) :-
list_subsequence(List, Sub),
sum_list(Sub, Sum).
好的让我们用整数和浮点数运行另一个查询。。。那也行吗
?- subsetsum([1,2.1,5,3,2], 5.1, Xs).
Xs = [1,2.1,2]
; Xs = [2.1,3]
; false.
?子类([1,2.1,5,3,2],5.1,Xs)。
Xs=[1,2.1,2]
; Xs=[2.1,3]
; 错。
看起来不错 使用,我们可以将库谓词
与您已经获得的子集/2
一起使用!注意,我给了subset/2
一个更合适的名称list\u subsequence/2
:
list_subsequence([], []).
list_subsequence([X|Xs], [X|Ys]) :-
list_subsequence(Xs, Ys).
list_subsequence([_|Xs], Ys) :-
list_subsequence(Xs, Ys).
subsetsum(List, Sum, Sub) :-
list_subsequence(List, Sub),
sum_list(Sub, Sum).
好的让我们用整数和浮点数运行另一个查询。。。那也行吗
?- subsetsum([1,2.1,5,3,2], 5.1, Xs).
Xs = [1,2.1,2]
; Xs = [2.1,3]
; false.
?子类([1,2.1,5,3,2],5.1,Xs)。
Xs=[1,2.1,2]
; Xs=[2.1,3]
; 错。
看起来不错 如果使用的所有数字都是整数,并且您的Prolog处理器支持,请按此操作 :- use_module(library(clpfd)). z_z_product(A,B,AB) :- AB #= A*B. subsetsum_(Zs, Sum, Bs, [Sum|Vs]) :- same_length(Zs, Bs), append(Zs, Bs, Vs), Bs ins 0..1, maplist(z_z_product, Zs, Bs, Xs), sum(Xs, #=, Sum). :- (). z_z_乘积(A,B,AB):- ABA*B。 子合同(Zs、Sum、Bs、[Sum|Vs]):- (Zs,Bs), (Zs、Bs、Vs), Bs0..1, (z_z_产品,Zs,Bs,Xs), (Xs,#=,和)。 示例查询: ?- subsetsum_([1,2,5,3,2], 5, Sel, Vs), labeling([], Vs). Sel = [0,0,0,1,1], Vs = [5,1,2,5,3,2,0,0,0,1,1] ; Sel = [0,0,1,0,0], Vs = [5,1,2,5,3,2,0,0,1,0,0] ; Sel = [0,1,0,1,0], Vs = [5,1,2,5,3,2,0,1,0,1,0] ; Sel = [1,1,0,0,1], Vs = [5,1,2,5,3,2,1,1,0,0,1] ; false. ?子系统([1,2,5,3,2],5,Sel,Vs),([],Vs)。 Sel=[0,0,0,1,1],Vs=[5,1,2,5,3,2,0,0,0,1,1] ; Sel=[0,0,1,0,0],Vs=[5,1,2,5,3,2,0,0,1,0,0] ; Sel=[0,1,0,1,0],Vs=[5,1,2,5,3,2,0,1,0,1,0] ; Sel=[1,1,0,0,1],Vs=[5,1,2,5,3,2,1,1,0,0,1] ; 错。
如果所使用的所有数字都是整数,并且您的Prolog处理器支持,请像这样继续 :- use_module(library(clpfd)). z_z_product(A,B,AB) :- AB #= A*B. subsetsum_(Zs, Sum, Bs, [Sum|Vs]) :- same_length(Zs, Bs), append(Zs, Bs, Vs), Bs ins 0..1, maplist(z_z_product, Zs, Bs, Xs), sum(Xs, #=, Sum). :- (). z_z_乘积(A,B,AB):- ABA*B。 子合同(Zs、Sum、Bs、[Sum|Vs]):- (Zs,Bs), (Zs、Bs、Vs), Bs0..1, (z_z_产品,Zs,Bs,Xs), (Xs,#=,和)。 示例查询: ?- subsetsum_([1,2,5,3,2], 5, Sel, Vs), labeling([], Vs). Sel = [0,0,0,1,1], Vs = [5,1,2,5,3,2,0,0,0,1,1] ; Sel = [0,0,1,0,0], Vs = [5,1,2,5,3,2,0,0,1,0,0] ; Sel = [0,1,0,1,0], Vs = [5,1,2,5,3,2,0,1,0,1,0] ; Sel = [1,1,0,0,1], Vs = [5,1,2,5,3,2,1,1,0,0,1] ; false. ?子系统([1,2,5,3,2],5,Sel,Vs),([],Vs)。 Sel=[0,0,0,1,1],Vs=[5,1,2,5,3,2,0,0,0,1,1] ; Sel=[0,0,1,0,0],Vs=[5,1,2,5,3,2,0,0,1,0,0] ; Sel=[0,1,0,1,0],Vs=[5,1,2,5,3,2,0,1,0,1,0] ; Sel=[1,1,0,0,1],Vs=[5,1,2,5,3,2,1,1,0,0,1] ; 错。
变量必须是大写的我知道,我在定义susbsetsum函数时遇到了问题,谢谢,我2小时后要考试。。请有人帮助我你的代码有几个语法错误。通过在考试前修正问题来提高你的问题质量。。。这是巩固你积累的知识的好方法!(这也让你保持冷静!)变量必须是大写的我知道,我在定义susbsetsum函数时遇到了麻烦,谢谢,我2小时后就要考试了。。请有人帮助我你的代码有几个语法错误。通过在考试前修正问题来提高你的问题质量。。。这是巩固你积累的知识的好方法!(它也能让你保持冷静!)