问题陈述:给定一个包含整数和整数列表的列表。您必须从每个子列表中删除第 1、2n、4、8 等元素。
我的解决方案
domains
list=integer*
elem=i(integer);l(list)
clist=elem*
predicates
modify(list, list, integer, integer)
exec(clist, clist)
clauses
modify([], [], _, _).
modify([H|T], Mod, I, P):-
P=I,
!,
I1=I+1,
P1=P*2,
modify(T, Mod, I1, P1).
modify([H,T], [H|Mod], I, P):-
I1=I+1,
modify(T, Mod, I1, P).
exec([], []).
exec([i(N)|T], [i(N)|LR]):-
exec(T, LR).
exec([l(L)|T], [l(Mod)|LR]):-
modify(L, Mod, 1, 1).
do():-
exec([i(1),l([1,2,3,4,5,6,7,8,9]),l([1,2,3,4])],X),
write(X).
问题是该算法一直有效,直到它从每个子列表中删除第一个和第二个元素,但从那时起不会删除任何东西,我不确定我做错了什么。
theexec predicate
用于断言当前元素是整数还是整数列表,将整数添加到结果中,或者将修改后的列表添加到结果中。
修改给定列表并应删除位置幂为 2的modify predicate
所有元素。
我写了do predicate
只是为了把它作为一个目标,以避免每次我想测试它时都写这个列表。