2016-05-21 4 views
2

Я хочу найти разницу между квадратом + 1 и квадратом a is 2a + 1 в прологе. По этой причине я написал такой код:Пролог Разница квадратов

:- use_module(library(clpfd)). 

kare(X,Y):- Y #= X*X. 

abc(A,B,F) :- 
     kare(A,P), 
     kare(B,T), 
     F is P-T. 

Я пробовал с

?- abc(D,E,P). 

ERROR: is/2: Arguments are not sufficiently instantiated. 

кто поможет мне с этой проблемой.

+2

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

+0

Я не могу спросить его, он говорит, подождите 3 дня – dymayd

+1

Пожалуйста, верните свои изменения, примите ответ и * затем * задайте новый вопрос. – mat

ответ

3

Вы получаете сообщение об ошибке, потому что вы используете is/2, который ожидает, что аргументы будут связаны. Но в вашем примере запроса аргументы D, E и P являются несвязанными переменными, поэтому P и T также не связаны, когда вы достигаете цели с помощью is/2. Так как вы уже используете clpfd, использовать # =/2 вместо:

abc(A,B,F) :- 
    kare(A,P), 
    kare(B,T), 
    F #= P-T. % <- here 

Таким образом, ваш запрос дает результат:

?- abc(D,E,P). 
D^2#=_A, 
_A in 0..sup, 
P+_B#=_A, 
_B in 0..sup, 
E^2#=_B 
+0

okey как можно найти ** найти разницу между квадратом a + 1 и квадратом a is 2a + 1 ** – dymayd

+1

@dymayd: Я не уверен, правильно ли понимаю, что вы подразумеваете под * разницей между квадратом + 1 и квадрат a равен 2a + 1 *. Глядя на ваш предикат abc/3, я предполагаю, что вы можете запросить что-то вроде: '? - D # = A + 1, E # = 2 * A + 1, abc (D, E, P) .' или возможно, с конкретным значением для 'A':'? - A # = 2, D # = A + 1, E # = 2 * A + 1, abc (D, E, P). Вы можете привести несколько примеров ожидаемых результатов? – tas