Если все используемые числа являются целыми числами, рассмотрите возможность использования clpfd !
<i>:- <a href="http://www.swi-prolog.org/pldoc/doc_for?object=use_module/1" rel="nofollow">use_module</a>(<a href="http://www.swi-prolog.org/pldoc/man?section=clpfd" rel="nofollow">library(clpfd)</a>).</i>
На основе chain/2
мы можем определить up_down_zs/3
следующим образом:
<i>up_down_zs(Up, [P|Down], Zs) :-
Up = [_,_|_],
Down = [_|_],
<a href="https://www.complang.tuwien.ac.at/ulrich/iso-prolog/prologue#append" rel="nofollow">append</a>(Up, Down, Zs),
append(_, [P], Up),
<a href="http://www.swi-prolog.org/pldoc/man?section=clpfd" rel="nofollow">chain</a>(Up, #<),
chain([P|Down], #>).</i>
Во-первых, в некоторых случаях мы все ожидаем сбоя:
?- <i><a href="https://www.complang.tuwien.ac.at/ulrich/iso-prolog/prologue#member" rel="nofollow">member</a>(Zs, [[1,1],[1,2,2,1],[1,2,3,4],[1,2,3,4,5,5,6,4,3,2,1]]),
up_down_zs(_, _, Zs).</i>
false.
Теперь давайте выполним выполнимых запросов!
?- <i>up_down_zs(Up, Down, [1,2,3,4,5,6,4,3,2,1]).</i>
( Up = [1,2,3,4,5,6], Down = [6,4,3,2,1]
; false
).
?- <i>up_down_zs(Up, Down, [1,2,3,1]).</i>
( Up = [1,2,3], Down = [3,1]
; false
).
?- <i>up_down_zs(Up, Down, [1,2,1]).</i>
( Up = [1,2], Down = [2,1]
; false
).