开发者

prolog program for determining whether any two pairs in a list have the same sum

How can I write a relation in prolog that determines if there are any two pairs in a list with the same sum. The relation should fail if there exist no pairs whose sums are equal. The relation should also fail if the list contains less than four elements.

  • list([1 2 3]) fails since it only has 3 elements
  • list([2 3 4 1]) succeeds since 2+3=4+1
  • list([3 1 2 4 5 6]) succeds since 5+1=2+4
  • list([1 8 20 100]) fails since there are n开发者_运维知识库o pairs with equal sums


How about this algorithm: take any two pairs of numbers, and see if they match. Here is the code for it:

has_equal_sums(List) :-
    select(A, List, List2),
    select(B, List2, List3),
    select(C, List3, List4),
    select(D, List4, _),
    A+B =:= C+D.

If you want to make sure it works, or for debug purpose, you can display the two selected pairs as an output:

has_equal_sums(List, [[A, B], [C, D]]) :-
    select(A, List, List2),
    select(B, List2, List3),
    select(C, List3, List4),
    select(D, List4, _),
    A+B =:= C+D.

Here are a few examples of usage:

?- has_equal_sums([1, 2, 3, 6, 5], X).
X = [[1,6],[2,5]] ? ;
X = [[2,6],[3,5]] ?

?- has_equal_sums([1, 2, 3, 5], X).
no

?- has_equal_sums([1, 2, 3], X).
no


So I checked with my professor and since our deadline has passed, he is OK with me posting my solution to this problem. This is probably not the most succinct way to solve the problem, and I'm leaning on my Scheme a bit, but it appears to work:

%car operations
    car([],null).
    car([X|_],X).
   cadr([_|L],R) :-
    car(L,R).
  caddr([_|L],R) :-
    cadr(L,R).

%cdr operations
   cdr([],[]).
   cdr([_|L],L).
  cddr([_|L],R) :-
    cdr(L,R).
 cdddr([_|L],R) :-
    cddr(L,R).

%two-pair operation
%  This algorithm is based on the provided example
%  solution for CSC388FA09HW4.
long-enough(L,_) :-
    length(L,X),
    X>3.
too-long(L,_) :-
    length(L,X),
    X>4.
two-pair([Head|Tail]) :-
    long-enough([Head|Tail],_),
    (
        (car(Tail,N2),cadr(Tail,N3),caddr(Tail,N4),Head+N2=:=N3+N4);
        (cadr(Tail,N2),car(Tail,N3),caddr(Tail,N4),Head+N2=:=N3+N4);
        (caddr(Tail,N2),car(Tail,N3),cadr(Tail,N4),Head+N2=:=N3+N4)
    );
    too-long([Head|Tail],_),
    (
        two-pair(Tail);
        cdr(Tail,N2),two-pair([Head|N2]);
        car(Tail,N2),cddr(Tail,N3),two-pair([Head|[N2|N3]]);
        car(Tail,N2),cadr(Tail,N3),cdddr(Tail,N4),two-pair([Head|[N2|[N3|N4]]])).
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜