2015-11-10 10 views
0

Я изучаю Пролог. Я работаю над заданием. Я уже подготовил код, который частично работает. Но, как-то он дает несколько дубликатов ответов.Как я могу предотвратить, чтобы этот код Prolog дал несколько дубликатов ответа?

Возникает вопрос:

% Every letter represents a Digit (0,...,9). 
% Leading digits (S and M) can not be 0. 
% S E N D 
% + M O R E 
% --------- 
% M O N E Y 
% Write a Prolog program that solves the quiz, i.e., that finds the 
% appropriate values for S,E,N,D,M,O, ... such that the addition is correct. 

Решение, которое я придумал это:

jobs1([0,1,2,3,4,5,6,7,8,9]). 

solution1([_,_,S,E,N,D,M,O,R,Y], 
    constraints([ 
     \+ S is 0, 
     \+ M is 0, 
     0 is (10000*M+1000*O+100*N+10*E+Y - (1000*S+100*E+10*N+D + 1000*M+100*O+10*R+E)) ])). 

puzzle1(Erg) :- write("Puzzle1 "), nl, jobs1(S), 
    solution1([_,_|Erg] , 
      constraints(Cs)),permC(S,[_,_|Erg],Cs) . 

Но, когда я запускаю этот код, я получаю ответы, как это:

7 ?- puzzle1(S). 
Puzzle1 
S = [9, 5, 6, 7, 1, 0, 8, 2] ; 
S = [9, 5, 6, 7, 1, 0, 8, 2] ; 

Я знаю, почему это происходит (потому что я игнорирую первые 2 позиции и из-за их перестановки результат показывает 2 раза). Можете ли вы, пожалуйста, помочь понять, как я могу удалить его, не используя! (Потому что, если есть несколько ответов, будет показан только первый ответ, чего не ожидается.)

Заранее благодарен!

+0

Почему у вас есть ведущий '_' в первом аргументе' solution1'? –

+0

Потому что я должен назначить 0,1, ... 9 символам S, E, N, D, M, O, R, Y. Итак, я должен был положить туда _, _ там. В противном случае программа возвращает false. –

+0

Как выглядит определение 'permC/3'? – repeat

ответ

4

Ваш код проверяет каждую перестановку 10 цифр и отчеты по каждому из них, которые соответствуют ограничениям. Вы показываете только 8, но есть еще 2 и, следовательно, 2 разных перестановки с теми же последними 8 цифрами. Таким образом, вы могли бы, например, добавить требование о том, чтобы цифры, которые вам не нравятся, находятся в определенном порядке, так что только 1 перестановка будет приемлемой.