#prolog #transitive-closure
#пролог #транзитивное замыкание
Вопрос:
Я изо всех сил пытаюсь определить способ преобразования списка в строку. Этот список является результатом предиката findall.
смотрите ниже мой код.
edge(a,b).
edge(a,c).
edge(b,c).
edge(c,d).
edge(c,e).
edge(d,e).
edge(f,g).
edge(g,h).
route(X, Z, []) :- edge(X, Z).
route(X, Z, [Y|T]) :- edge(X, Y), route(Y, Z, T).
allways(X, Y) :- findall(E, (route(X, Y, E), write(E), nl), _).
%allways(X, Y) :- findall(E, (route(X, Y, E), with_output_to(atom(_),maplist(write, E)), nl), _).
%allways(X, Y) :- findall(E, (route(X, Y, E), atomic_list_concat(E,'',A), nl), _),write(A).
мой вывод
?- allways(a,e).
[b,c]
[b,c,d]
[c]
[c,d]
ожидаемый результат
?- allways(a,e).
bc
bcd
c
cd
Я пробовал разные способы преобразования списка в строку, используя предикат with_output_to и предикат atomic_list_concat, но ничего не работает.
Ответ №1:
Когда вы говорите «строка», что вы имеете в виду?
Существует множество предикатов для объединения списка с атомом. В вашем случае atomic_list_concat/2
звучит примерно так.
Однако ваша проблема заключается в том, как вы написали findall, вы фиксируете неправильную переменную.
?- findall(Str, ( route(a, e, E), atomic_list_concat(E, Str) ), Strs),
forall(member(Str, Strs), format("~w~n", [Str])).
или, если вам вообще не нужен список, не используйте findall вообще.
?- forall(( route(a, e, E),
atomic_list_concat(E, Str)
),
format("~w~n", [Str])).
Комментарии:
1. мне кажется, что ваше понимание строки в порядке (без запятой). Но я хотел вывести ‘Str’, а не ‘Strs’ из вашего кода. Я изменил ваше предложение, но оно не работает. « findall(E, (route(X, Y, E), atomic_list_concat(E,write(Str))), Strs) «
2. @mkpisk
write
Не должно быть внутри findall, это точно. Возьмите мой код точно таким, какой он есть, и после findall выполните запись. И не помещайте код в комментарии.3. Это не сработает, если я напишу (Str) снаружи, указав , (И условие) для findall .
4. @mkpisk существует (счетно?) Бесконечное количество способов сделать что-то, что не работает. Смотрите мой отредактированный ответ.
5. потрясающе. Это новый трюк для использования forall и способа, которым вы написали format . Большое вам спасибо за обучение 🙂