Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Prolog > Inner compound terms


Автор: JavaDell 7.5.2013, 00:00
Есть задача создать предикат вида inner(Term, A), в котором Term - сколь угодно вложенный compound term с arity 1.
Например a(b(c(d(o)))).
Предикат должен отыскать и поместить в A самый вложенный терм, в данном примере это буква 'o'.
Тоесть если дано inner( a(b(c(d(o)))), A ), вывод должен быть A = o.

Я подошел к вопросу так:
inner(Term, A) :-
        Term =.. [A|List],
        Term1 =.. List,
        inner(Term1, _).

Превращать терм в список, отрубать голову, превращать обратно в терм и так далее.
Проблема в том, что список когда-то закончится и я не могу понять как тут проверить на пустой список
и остановить рекурсию с выводом оставшегося последнего терма.

(Не пинайте сильно, я не настоящий сварщик.)

Автор: Фантом 7.5.2013, 00:25
У Вас что-то странное получилось. Надо как-то так:
Код

inner(Term,A):- Term =.. L, L=[A|[]].
inner(Term,A):- Term =.. L, L=[_|T], Term1 =..T, inner(Term1,A).

Не самый эффективный вариант, но самый простой.

Автор: JavaDell 7.5.2013, 02:19
Фантом,  Благодарю.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)