I need to define divide so that List [1,2,3,4,5]
divides into:
a = [1,2,3}
b = [4,5]
I'm getting an error that says "Arguments are not sufficiently instantiated"
, and I don't know enough about the language to figure out what my problem is, or if my design is even right. Any guidance would be appreciated.
So here's what I have so far:
append([],L2,L2).
append([H|T],L2,[H|L3]) :- append(T,L2,L3).
lengthIs([],N).
lengthIs([H|T],N) :- lengthIs(T,M), N is M+1.
divide([],[],[]).
divide([H|T],L2,L3) :-
( lengthIs(L2, M) < lengthIs(L1,N)/2
-> divide(T, append(L2, H, X), L3)
; divide(T, L2, append(L3,H,Y))
).
No need to check sizes. Just do it like this:
This is how I did it. Almost no built-ins:
Let's give the predicate a more relational name:
list_half_half/3
length/2
andappend/3
are predefined in practically all recent Prologs.This is GNU Prolog:
append is a pre-defined predicate, so that might be the issue: http://en.wikibooks.org/wiki/Prolog/Lists#The_append_predicate
You also never defined 'N' in lengthIs - you need to set the empty list as 0, not N/ There's likely also a size function
The underscore tells Prolog we don't care about that bit in that predicate definition.
Something like this should work
This is the most efficient solution conforming to your specification for most Prolog implementations:
If you don't mind which elements go into the sublists as far as they are of similar length (as in the solution from Konstantin Weitz post), then you can use :
Surely the effect of this code (
lengthIs(L2, M) < lengthIs(L1,N)/2 -> ...
) isn't what you expect: it doesn't compare numbers, but terms. You should write it this way:Another typo like mistake: the first clause of lengthIs/2 should read