Пролог, программа для определения, если два списка не равны - PullRequest
2 голосов
/ 19 октября 2011

Я хочу собрать программу Prolog, чтобы определить, не совпадают ли два списка, представленных в качестве аргументов.

Это то, что я сделал до сих пор.

not-equal([],[a|_]).
not-equal([a|_],[H|T]):-not-equal(a,T).

Ответы [ 2 ]

6 голосов
/ 19 октября 2011

Списки Пролога - это просто термины, которые можно «сравнивать» напрямую с помощью операторов равенства Не равно может означать не различимо или не идентично .

не различимо

?- [1, 2] \= [1, 2].        ===> false
?- [1, 2] \= [1, X].        ===> false
?- [1, 2] \= [1, 3].        ===> true

не идентично

?- [1, 2] \== [1, 2].        ===> false
?- [1, 2] \== [1, X].        ===> true
?- [1, 2] \== [1, 3].        ===> true
0 голосов
/ 19 октября 2011

Вот что я придумал:

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]).

Дайте мне знать, если это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...