Чтобы вернуть значение, вам нужен другой параметр в вашем предикате (не функция btw).Этот параметр будет свободной переменной, и вы свяжете его с результатом.
В спецификациях пролога такие параметры отмечены -Параметр, в то время как отмечены уже связанные параметры + Параметр и параметры, которые могут быть как связаны, так и свободны, являютсяотметил? Параметр.Так что здесь у вас может быть комментарий, такой как:
% guess/3 (specify the arity of your predicate)
% guess(+Color, +House, -Result) (give info about your parameters)
% guess finds a color shared by Color and House and binds it to Result.
Тогда предикаты, такие как pink, houseA и т. Д., Не так уж хороши для поиска чисел.Вы можете превратить их в более адаптированные предикаты, храня числа в списке:
green([1, 15, 23, 24]).
pink([2, 6, 10, 18]).
houseA([2, 4, 7, 14]).
Когда мы получили этот список, мы можем написать:
guess(Color, House, Result) :-
call(Color, Pool1),
Если вы вызываете догадку (розовый, houseA), который будет называть ваш предикат розовым с аргументом Pool1, пролог попытается сопоставить Pool1 и [2, 6, 10, 18], поэтому Pool1 будет точно привязан к этому списку.
call(House, Pool2),
То же самое с houseA и Pool2.
member(Result, Pool1),
Теперь мы говорим прологу, что хотим, чтобы наш Результат был членом Pool1
member(Result, Pool2),
И членом Pool2.
write('Your number is '),
write(Result),
write(.),
nl.
Наконец, мы отображаем сообщение.
Пролог отобразит результат как R = x;ложь ниже этого, если вы не хотите;ложная часть, вы можете добавить «cut»:
nl.
=>
nl,
!.
Предикат ! / 0 (cut) говорит прологу не возвращаться назадпопытаться найти другие решения.Там он должен был отозвать участника, объясняющего, почему пролог вернул выбор только с одним результатом и ложным.
Надеюсь, это поможет.Если у вас возникли проблемы с пониманием некоторых частей, скажите об этом, и я дам информацию.