比较prolog列表

时间:2016-03-29 12:29:15

标签: list prolog

我正在尝试制作一个序言“comprueba(A,B,C,D,E)”来做下一个陈述:

  • 所有参数都是列表。
  • 列表D仅包含A和B上同时出现的元素。
  • 列表D元素的数量在A中必须是相同的事件。
  • 列表E仅包含不在C上而不在D上的A元素。
  • 列表E元素的发生次数必须是A中出现次数的三倍。
  • 在D或E中没有比这些更多的元素。
  • 即使D或E的顺序与A不同,谓词也必须为真。

所以这是我的代码:

comprueba(A,B,C,D,E) :- lista([A]), 
                        lista([B]), 
                        lista([C]), 
                        lista([D]), 
                        lista([E]),
                        inter(A,B,D),
                        checko(D,D,A,1).
                        %checke2(A,C,D,E),
                        %checko(E,E,A,3).

lista([]).
lista([_|T]) :-lista(T).

inter([], _, []).
inter([H1|T1], L2, [H1|Res]) :- memberof(H1, L2), inter(T1, L2, Res).
inter([_|T1], L2, Res) :- inter(T1, L2, Res).

checke2([],_,_,_).
checke2(A,C,D,E) :- subtract(A,D,X), subtract(A,C,Y), inter(X,Y,E).

count(_, [], N) :- N is 0. 
count(X, [X|T], N1) :- count(X, T, N2), N1 is N2 + 1.     
count(X, [Y|T], N) :- X \= Y, count(X, T, N).  

memberof(X, [X|_]).
memberof(X, [_|T]) :- memberof(X,T).

checko([],_,_,_).
checko([H|T],L1,L2,N) :- count(H,L1,N1), count(H,L2,N2), N3 is N * N2, N1 = N3, checko(T,L1,L2,N).

在做了一些测试后,我被困了,因为如果列表不在同一个订单上,我无法理解,例如:

17 ?- comprueba([1,2,3,4,2,5,8,9],[2,3,4,7],[1,2,3,8],[2,2,3,4],[5,5,5,9,9,9]).
false.

18 ?- comprueba([1,2,3,4,2,5,8,9],[2,3,4,7],[1,2,3,8],[2,3,4,2],[5,5,5,9,9,9]).
true 

所以我真的请求你帮忙尝试解决它,并继续下一部分,用E列表。

提前谢谢你。

PD: 对不起,如果格式不正确,这是我的第一篇帖子:)

1 个答案:

答案 0 :(得分:1)

您可以添加一个目标,将D描述为第4个列表的任何排列(在下面的示例D2中)。

comprueba(A,B,C,D,E) :- lista([A]), 
                        lista([B]), 
                        lista([C]), 
                        lista([D2]), 
                        lista([E]),
                        inter(A,B,D2),
                        checko(D2,D2,A,1),
                        permutation(D2,D).

如果你不允许使用库中的排列/ 2(列表)排列可能看起来像这样:

% permutation(List1,List2)
% List2 is a permutation of List1
permutation([],[]).
permutation(Xs,[Z|Zs]) :-
    element(Z,Xs,Ys),
    permutation(Ys,Zs).

% element(X,List1,List2)
% X is element of List1, List2 = List1 without X
element(X,[X|Xs],Xs).
element(X,[Y|Ys],[Y|Zs]) :-
    element(X,Ys,Zs).

有了这个额外的目标,你的谓词comprueba / 5就可以处理你的两个查询。

?- comprueba([1,2,3,4,2,5,8,9],[2,3,4,7],[1,2,3,8],[2,2,3,4],[5,5,5,9,9,9]).
yes
?- comprueba([1,2,3,4,2,5,8,9],[2,3,4,7],[1,2,3,8],[2,3,4,2],[5,5,5,9,9,9]).
yes