2017-01-22 7 views
1

Предположим, что я хочу найти два числа, в которых их сумма равна 8, составляет от 1 до 9 и должна быть разной (очевидно, что эти числа (7, 1), (6,2) и т. Д.). Так я и написал.Как найти два номера, где применяется ограничение?

dif_list([H|T]):- \+ member(H,T),dif_list(T). 
dif_list([]). 

check1_9([H|T]):-H>=1,H=<9,check1_9(T). 
check1_9([]). 

find_number([A,B],N) :- N =:= A+B,dif_list([A,B]),check1_9([A,B]). 

После этого я попрошу пролога

?-find_number([A,B],8). 
ERROR: =:=/2: Arguments are not sufficiently instantiated 

Моя цель состоит в том, что пролог будет распечатываться для меня пример results.For:

?-find_number([A,B],8). 
    A = 7, 
    B = 1 ; 
    A = 6, 
    B = 2 ; 
    ... 
+1

Вы уже приняли ответ перед своим UPDATE1. Здесь очень плохо, чтобы задать вопрос, получить законные ответы на этот вопрос, а затем изменить или усилить вопрос, используя эти ответы, а затем сделать ранее предоставленные ответы неполными или недействительными. Если у вас есть еще вопросы, задайте новый вопрос. Я голосую, чтобы закрыть этот вопрос, исходя из этого, неясно, что вы спрашиваете, поскольку он меняется после того, как уже даны ответы. – lurker

+0

Вторые секунды: Пожалуйста, восстановите этот вопрос, для которого были даны действительные ответы, которые могут быть полезны и для других, и задайте новый вопрос для новой проблемы. – mat

+0

Хорошо Я сделал это –

ответ

2

Лучший способ справиться с такой проблемой в Прологе является использование (FD) библиотека CLP:

:- [library(clpfd)]. 

sum_of(A, B, Sum) :- 
    A #> 0, 
    B #> 0, 
    A + B #= Sum. 

?- sum_of(A, B, 8), label([A, B]). 
A = 1, 
B = 7 ; 
A = 2, 
B = 6 ; 
A = 3, 
B = 5 ; 
A = B, B = 4 ; 
A = 5, 
B = 3 ; 
A = 6, 
B = 2 ; 
A = 7, 
B = 1. 

?- 

Если вы хотите добавок, которые могут быть уникальными, вы можете дополнительно ограничить его:

sum_of(A, B, Sum) :- 
    A #> 0, 
    B #>= A, 
    A + B #= Sum. 

Нет необходимости использовать список для управления переменными A и B, но вы можете, если хотите: sum_of([A,B], Sum).

-1

Пролог не то, что декларативный: на самом деле есть программирование на основе ответа (ASP) или программирование логических ограничений (clp) языки, на которых вы c просто определить набор ограничений, а решатель конечных доменов нацелен на его решение (но это займет значительное время).

Я хотел бы предложить вам определить вашу программу следующим образом:

find_number(A,B,N) :- 
    member(A,[1,2,3,4,5,6,7,8,9]), 
    member(B,[1,2,3,4,5,6,7,8,9]), 
    N is A+B, 
    A \= B. 

Здесь member/2 будет экземплярA и B до значений, которые предусмотрены в списке, так 1..9, рядом вы используете is/2 для расчета суммируйте и убедитесь, что сумма равна N. Вы можете позвонить по номеру N is A+B, если A и B имеют значение. Наконец, мы говорим, что A \= B (A не равно B).

При запуске этот предикат, он производит:

?- find_number(A,B,8). 
A = 1, 
B = 7 ; 
A = 2, 
B = 6 ; 
A = 3, 
B = 5 ; 
A = 5, 
B = 3 ; 
A = 6, 
B = 2 ; 
A = 7, 
B = 1 ; 
false. 

Однако вы можете также запросить с A и B уже заполненным, или один из них заполнены, или где сумма остается открытым. Итак:

?- find_number(A,2,8). 
A = 6 ; 
false. 

или:

?- find_number(A,2,N). 
A = 1, 
N = 3 ; 
A = 3, 
N = 5 ; 
A = 4, 
N = 6 ; 
A = 5, 
N = 7 ; 
A = 6, 
N = 8 ; 
A = 7, 
N = 9 ; 
A = 8, 
N = 10 ; 
A = 9, 
N = 11 ; 
false. 
+1

В прологе есть библиотека CLP (FD), поэтому в Prolog вы можете сделать декларативную арифметику. – lurker

+0

@ lurker: Да, я знаю, что (я работал с ним уже), что немного превращает Prolog в решателя логического программирования ограничений. Я имел в виду, что по умолчанию Prolog не является решателем логического программирования ограничений. –

+1

Не уверен, что полностью согласен. Я думаю, это зависит от того, что вы подразумеваете «по умолчанию». GNU Prolog позволяет программировать логику ограничений по умолчанию (без явного включения дополнительных библиотек). Хотя SWI требует, чтобы вы явно включали библиотеку, для этого требуются и другие включения в библиотеку, что я бы рассмотрел более основные возможности. Это считается основной частью Prolog. – lurker

 Смежные вопросы

  • Нет связанных вопросов^_^