Я делаю проект, и я застрял в ситуации, когда мне нужно сравнить два списка и вернуться, если хотя бы один член из списка находится в другом списке. Довольно просто, но списки могут содержать не только числа, но и диапазоны чисел. Что-то вроде: [1,3,диапазон(5,10),25]
Я думаю, что моя основная проблема заключается в повторении списков, потому что он возвращает true только в том случае, если первый член списка соответствует атому. Это мой код для сравнения:
findin(E,[H|T]) :-
E == H ;
(H == range(X,Y), E \== range(Xe,Ye), between(X,Y,E)) ;
(E == range(Xe,Ye), H \== range(X,Y), between(Xe,Ye,H)) ;
(E == range(Xe,Ye), H == range(X,Y), (between(X,Y,Xe) ; between(Xe,Ye,X))) ,
findin(E,T).
И код для вызова функции findin/2:
find([Ha|Ta],[Hb|Tb]) :-
findin(Ha,[Hb|Tb]),
find(Ta,[Hb|Tb]).
Я что-то упускаю? Кроме того, есть идеи для повторения списков A и B из функции find/2?
=
означает унифицировать переменные и==
сравнить их, а в прологе они вызывают диапазон (X, Y) предикатом / 2, а не функцией, поэтому они не будут возвращать значение. - person Luai Ghunim   schedule 05.11.2017