пролог, тест (X, Y, Z): - Y - X + Z - PullRequest
       16

пролог, тест (X, Y, Z): - Y - X + Z

2 голосов
/ 05 декабря 2010

Как получить Y и Z в прологе, когда я знаю только X?

Например:

test(X, Y, Z) :- X is Y + Z.

но ошибка:

?- test(2, Y, Z).
ERROR: is/2: Arguments are not sufficiently instantiated

Ответы [ 2 ]

3 голосов
/ 05 декабря 2010

Вы должны передать их в качестве аргументов. Арифметика Пролога (is/2) не является волшебной палочкой, ее правильный аргумент должен быть полностью создан (без переменных), прежде чем ее можно будет оценить.

Если вы хотите, чтобы предикат работал в нескольких «направлениях», с несколькими комбинациями основных терминов и переменных, вам нужно использовать логическое программирование с ограничениями, но это довольно сложная область логического программирования. В CLP для конечных доменов вы можете сказать

:- use_module(library(clpfd)).  % this differs between implementations
test(X,Y,Z) :- X #= Y + Z.
2 голосов
/ 05 декабря 2010

Это невозможно, потому что вы можете выбрать Y как угодно и вычислить Z или наоборот.

Хотя если вы знаете, что Y и Z отограниченный набор (например, положительные целые числа меньше 5), вы можете сделать что-то вроде:

valid_number(1).
valid_number(2).
valid_number(3).
valid_number(4).

test(X, Y, Z) :- valid_number(Y), valid_number(Z), X is Y + Z.
...