Вот что я придумал:
not-equal([],[H|_]).
not-equal([H|_],[]).
not-equal([H|T1],[H|T2]) :-
not-equal(T1,T2).
not-equal([H1|T1],[H2|T2]) :-
not(var(H1)),
not(var(H2)),
H1 =\= H2.
В ваших предикатах есть строчная буква «а», которая является атомом, а не переменной. Также, когда вы звоните not-equal(a,T)
, вы выходите за пределы использования списков, поэтому он не будет работать.
Я бы также рассмотрел вопрос об изменении имени предиката на not-unifiable
, поскольку список может содержать переменные, которые могут сделать их равными или нет в зависимости от того, как эти переменные будут объединены в будущем.
Есть все еще случаи, которые не работают с моим кодом выше.
В качестве альтернативы я хотел бы использовать вместо этого оператор ?=
, например:
not-equal([H1|T1],[H2|T2]) :- not([H1|T1]?=[H2|T2]).
Дайте мне знать, если это поможет.