ошибка создания пролога с оператором =: = - PullRequest
1 голос
/ 01 июня 2011

Я пишу функцию subseq, которая проверяет, является ли один список подпоследовательностью другого.

subseq([],[]).
subseq([],[Y|Ys]).
subseq([X|Xs],[Y|Ys]) :- X=:=Y, subseq(Xs,Ys).
subseq([X|Xs],[Y|Ys]) :- X=\=Y, subseq([X|Xs],Ys).

Когда я пытаюсь выполнить subseq (X, [1,2]), я получаю:

X = [] ? ;
uncaught exception: error(instantiation_error,(=:=)/2)

Почему это происходит?Я предполагаю, что [] управляется =: =, но как мне проверить / предотвратить эту ошибку?

1 Ответ

3 голосов
/ 01 июня 2011

Вы используете =:= и =\= здесь не в том контексте. Эти два оператора следует использовать, когда у вас есть два выражения под рукой, и вы хотите оценить и сравнить их. В вашем тесте, поскольку X заранее неизвестно, Пролог не может оценить X и сравнить с Y. Более подробную информацию о =:= и =\= можно найти здесь: Prolog Operator =: = .

В вашем коде вам нужно только объединение для атомов, поэтому одним из возможных исправлений может быть:

subseq([],[]).
subseq([],[_|_]).
subseq([X|Xs],[Y|Ys]) :- X=Y, subseq(Xs,Ys).
subseq([X|Xs],[Y|Ys]) :- X\=Y, subseq([X|Xs],Ys).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...