收集数据,但跳过非零引用数据
Collect data, but skip non-zero referenced-data
我有以下
fnf([],[],[]).
fnf([RH|RT],[CH|CT],[[RH,CH]|Res]) :- get(RH,CH,V), V == 0, fnf(RT,CT,Res).
我正在尝试仅收集 Cs 和 Rs 中 V 为零的元素。
上面的代码这样做了,但是当它达到非零值时失败了。
我只想跳过它们,而不是让整个目标失败。
这类作品
fnf([RH|RT],[CH|CT],[[RH,CH]|Res]) :- get(RH,CH,V), ( V == 0 -> fnf(RT,CT,Res);true).
还是_2044!!不应该在那里
F = [[1, 1], [2, 2]|_2044].
如何为 0 添加一个案例和为 non-zero 添加一个案例:
fnf([],[],[]).
fnf([RH|RT],[CH|CT],[[RH,CH]|Res]) :-
get(RH,CH,0),
fnf(RT,CT,Res).
fnf([_|RT],[_|CT],Res) :-
get(RH,CH,V),
dif(V, 0),
fnf(RT,CT,Res).
或
pairs_keys_values(Pairs, Rs, Cs),
findall([RH,CH], (member(RH-CH, Pairs), get(RH, CH, 0)), F).
如果您只想测试一次(get/3
+ 条件)然后保留项目或跳过它并继续递归,您可以使用 if-then-else 结构,如下所示:
fnf([], [], []).
fnf([RH|RT], [CH|CT], Res) :-
get(RH, CH, V),
( V==0 % test
-> Res=[[RH, CH]|Res1] % condition met, keep item
; Res=Res1 % condition not met, skip item
),
fnf(RT, CT, Res1).
另请注意,如果离开选择点,对 get/3
的调用可能会回溯。
我有以下
fnf([],[],[]).
fnf([RH|RT],[CH|CT],[[RH,CH]|Res]) :- get(RH,CH,V), V == 0, fnf(RT,CT,Res).
我正在尝试仅收集 Cs 和 Rs 中 V 为零的元素。 上面的代码这样做了,但是当它达到非零值时失败了。 我只想跳过它们,而不是让整个目标失败。
这类作品
fnf([RH|RT],[CH|CT],[[RH,CH]|Res]) :- get(RH,CH,V), ( V == 0 -> fnf(RT,CT,Res);true).
还是_2044!!不应该在那里
F = [[1, 1], [2, 2]|_2044].
如何为 0 添加一个案例和为 non-zero 添加一个案例:
fnf([],[],[]).
fnf([RH|RT],[CH|CT],[[RH,CH]|Res]) :-
get(RH,CH,0),
fnf(RT,CT,Res).
fnf([_|RT],[_|CT],Res) :-
get(RH,CH,V),
dif(V, 0),
fnf(RT,CT,Res).
或
pairs_keys_values(Pairs, Rs, Cs),
findall([RH,CH], (member(RH-CH, Pairs), get(RH, CH, 0)), F).
如果您只想测试一次(get/3
+ 条件)然后保留项目或跳过它并继续递归,您可以使用 if-then-else 结构,如下所示:
fnf([], [], []).
fnf([RH|RT], [CH|CT], Res) :-
get(RH, CH, V),
( V==0 % test
-> Res=[[RH, CH]|Res1] % condition met, keep item
; Res=Res1 % condition not met, skip item
),
fnf(RT, CT, Res1).
另请注意,如果离开选择点,对 get/3
的调用可能会回溯。