2010-12-05 4 views

ответ

2

Это невозможно, потому что вы можете выбрать 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. 
+1

Эти ограниченные ограничения также могут быть достигнуты с помощью `между/3`. – 2010-12-05 15:05:05

3

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

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

:- use_module(library(clpfd)). % this differs between implementations 
test(X,Y,Z) :- X #= Y + Z. 
+1

I ограничения предложения второго larsmans' и обнаружить, что гораздо проще понимать для новичков, чем низкоуровневая арифметика. На мой взгляд,/2 следует исключить из вводных курсов, потому что это слишком сложно понять для новичков. – mat 2010-12-05 13:58:54