0

给定格式列表,

[item(a), item(b), item(c), other(d), other(e) ...]

在项目的数量不固定的情况下,其他项目的数量也不是固定的,但项目总是在其他项目之前,我如何拆分列表以便我可以将项目和其他项目传递到不同的谓词中。

我一直在尝试寻找基于元素拆分列表的方法,但无法找到这样做的方法。

我需要编写一个谓词来获取这个列表,然后将项目传递给 an itemPredicate,将其他项目传递给otherPredicate.

如果我可以提供任何其他信息,请告诉我。

4

3 回答 3

2

让我们从一个谓词开始对元素进行分类。关于什么

item_t(item(_), true).
item_t(other(_), false).

请注意,此谓词对其真值有一个额外的参数。它只接受item(_)orother(_)元素。如果出现类似的东西,它会完全失败unfit(x)takeWhilet/3现在想象一下,我们有一个我们现在可以写的谓词

?- takeWhilet(item_t, [item(a), item(b), item(c), other(d), other(e)], Xs).

takeWhilet(_P_1, [], []).
takeWhilet(P_1, [E|_], []) :-
   call(P_1, E, false).
takeWhilet(P_1, [E|Es], [E|Fs]) :-
   call(P_1, E, true),
   takeWhilet(P_1, Es, Fs).

更漂亮地使用library(reif)s if_/3

takeWhilet(_P_1, [], []).
takeWhilet(P_1, [E|Es], Fs0) :-
   if_( call(P_1, E)
      , ( Fs0 = [E|Fs], takeWhilet(P_1, Es, Fs) )
      , Fs0 = [] ).

现在,我们可以other_t/2类似地定义...

于 2020-03-03T21:33:30.987 回答
0

item(_)一个与from分开的简单拆分谓词other(_)可以按如下方式工作:

split([], [], []).
split([item(A) | T], [item(A) | IT], OL) :- split(T, IT, OL).
split([other(A) | T], IL, [other(A) | OT]) :- split(T, IL, OT).

并像这样使用它:

?- split([item(1), other(2), other(3), item(4), other(5)], X, Y).
X = [item(1), item(4)],
Y = [other(2), other(3), other(5)].

它甚至不需要items 总是在others 之前。

于 2020-03-03T21:37:40.257 回答
0

您可以推广到任何类型的项目

work(item,L) :-
    format('args of \'item\' ~w~n', L).

work(other,L) :-
    format('args of \'other\' ~w~n', L).

work(anything, L) :-
    format('args of \'anything\' ~w~n', L).

work_element(Item) :-
    Item =.. [A|L],
    work(A, L).

my_split(In) :-
    maplist(work_element, In).

例如 :

?- my_split([item(a), item(b), item(c), other(d), other(e) , item(f), other(g)]).
args of 'item' a
args of 'item' b
args of 'item' c
args of 'other' d
args of 'other' e
args of 'item' f
args of 'other' g
true
于 2020-03-04T08:54:56.867 回答