Аргумент - простой пролог - PullRequest
0 голосов
/ 27 мая 2019

Хотите расширить аргумент q(M,N):-, который должен оценивать true, только если мы можем выразить M как сумму двух чисел, что эти же два числа дадут произведение N.Имея в виду что-то вроде A+B=M и A*B=N (M,N>0 оба целых числа)

Итак, я попробовал что-то вроде:

sum(A,B,M) :- M is A+B.

prod(A,B,N) :- N is A*B.

q(M,N) :- sum(A,B,M),
          prod(A,B,N).

Но да, не очень хороший план.

некоторые ожидаемые результаты должны быть:

| ?- q(18,45).
yes
| ?- q(45,18).
no
| ?- q(4,4).
yes
| ?- q(5,5).
no
| ?- q(16,64).
yes
| ?- q(12,25).
no
| ?- q(25,24).
yes
| ?- q(36,120).
no
| ?- q(100,2499).
yes
| ?- q(100,267).
no
| ?- q(653,98770).
yes
| ?- q(653,98880).
no

1 Ответ

0 голосов
/ 27 мая 2019

A очень базовое решение для вашей проблемы, используя between/3 из swi prolog, без значительных изменений вашей программы:

sum(A,B,M) :- M is A+B.

prod(A,B,N) :- N is A*B.

q(M,N) :- 
    between(0,1000,A),
    between(0,1000,B),
    sum(A,B,M),
    prod(A,B,N).

В этом случае все числа от 0 до 1000 считаются для A и B. Тем не менее, есть некоторые недостатки. Например, можно поменять значения для A и B (q(18,45) успешно для A = 3 и B = 15 и A = 15 и B = 3). Для устранения этой избыточности вы можете наложить B < A. Для дальнейшего улучшения алгоритма вы можете установить диапазон для A и B на основе значения суммы и произведения. Конечно, и A, и B должны быть меньше значения M в вашем коде. Как:

q(M,N) :- 
    between(0,M,A),
    between(0,A,B),
    M is A+B,
    N is A*B.

Вы можете добавить дополнительные ограничения для улучшения характеристик, например, учитывая случаи, когда продукт равен 0 и т. Д. *

Вы также можете использовать clpfd library для решения этой проблемы.

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