Как получить Y и Z в прологе, когда я знаю только Х?пролог, тест (X, Y, Z): - Y - X + Z
Например:
test(X, Y, Z) :- X is Y + Z.
но ошибка:
?- test(2, Y, Z).
ERROR: is/2: Arguments are not sufficiently instantiated
Как получить Y и Z в прологе, когда я знаю только Х?пролог, тест (X, Y, Z): - Y - X + Z
Например:
test(X, Y, Z) :- X is Y + Z.
но ошибка:
?- test(2, Y, Z).
ERROR: is/2: Arguments are not sufficiently instantiated
Это невозможно, потому что вы можете выбрать 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.
Вы должны передать их в качестве аргументов. Арифметика пролога (is/2
) не волшебная палочка, ее правый аргумент должен быть полностью инстанцирован (без переменных), прежде чем его можно будет оценить.
Если вы хотите, чтобы предикат работал в нескольких «направлениях», с несколькими комбинациями основных терминов и переменных, вы захотите использовать Программирование логики Constraint, но это довольно продвинутая область логического программирования. В CLP на конечных областях, вы можете сказать
:- use_module(library(clpfd)). % this differs between implementations
test(X,Y,Z) :- X #= Y + Z.
I ограничения предложения второго larsmans' и обнаружить, что гораздо проще понимать для новичков, чем низкоуровневая арифметика. На мой взгляд,/2 следует исключить из вводных курсов, потому что это слишком сложно понять для новичков. – mat 2010-12-05 13:58:54
Эти ограниченные ограничения также могут быть достигнуты с помощью `между/3`. – 2010-12-05 15:05:05