Как предотвратить не в прологе?

Пролог, рекурсивная функция: я хочу, чтобы он печатал 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).
Другие вопросы по тегам