Как предотвратить не в прологе?
Пролог, рекурсивная функция: я хочу, чтобы он печатал C с каждым элементом списка, например: C=30 и [H|T]= [-9,-10,-30]
myfunc(C,[H|T]):-
(\+([H|T]=[])),
write(C), write(' with '), write(H), nl,
myfunc(C,T).
в начале я проверяю, что заголовок списка не пуст. это дает мне такой вывод
30 with -9
30 with -10
30 with -30
(32 ms) no
этот вывод - то, что я хочу, но я не хочу получить "нет" в конце, потому что это также приводит к сбою родительской функции! как я могу удалить его и поставить вместо него "да"?
2 ответа
Решение
Простой способ: просто добавьте базовый случай с пустым списком.
myfunc(_, []) :- !.
myfunc(C,[H|T]):-
write(C), write(' with '), write(H), nl,
myfunc(C,T).
тестовое задание:
?- myfunc(30, [1, 2, 3]).
30 with 1
30 with 2
30 with 3
true.
Я не знаю, является ли это лучшим способом сделать это, но вы не дали нам много подробностей о всей вашей программе, поэтому я выбрал небольшую модификацию вашего предиката.
Если в вашем прологе есть maplist, вы можете написать
myfunc(N, L) :-
maplist(my_write(N), L).
my_write(N, Val) :-
format('~w with ~w~n', [N, Val]).
С SWI-Прологом и модулем лямбда
:- use_module(library(lambda)).
myfunc(N, L) :-
maplist(\X^format('~w with ~w~n', [N, X]), L).