所以我有一个项目,我正在尝试创建一个有3种不同情况的谓词,我将解释。
swapandp(L, P, Content, L) :-
refP(L, P, Content), !.
这是refP
给出位置P上列表L的内容的第一种情况,如果内容等于内容,则返回true并在那里停止,因为如果内容是同样,我不需要改变L中的任何内容。
swapandp(L, P, [Content], NewL) :-
swap(L, P, Content, NewL1),
relatedPs(P, Ps),
delNum(Content, NewL1, Ps, NewL).
这是第二种情况,如果Content是单元素列表,那么它将Content放在列表L的P位置,然后使用我创建的谓词来删除与P相关的位置中的相同内容,由另一个谓词相关的P放入列表Ps。
swapandp(L, P, Content, NewL) :-
swap(L, P, Content, NewL).
这是第三种情况,如果Content是一个包含多于1个元素的列表,那么它只是将Content放入列表L的位置P.
但是出了点问题。因为我可能没有正确定义3个案例,对不起我的英语并感谢你的帮助。
编辑1: 正在尝试一些事情,现在第一和第三个案例正在运作,所以我的问题不是第二个。
我试过这个: ? - swapandp([[[1,2],[1,2],[3],[1,4,5],[1,4]]],(1,1),[1],NewL) 。 NewL = [[[1],[1,2],[3],[1,4,5],[1,4]]]。
但预期结果应为: NewL = [[[1],[2],[3],[4,5],[4]]]。
无法弄明白。
编辑2:
refP(L, (Plin, Pcol), Content) :-
nth1(Plin,L,Line),
nth1(Pcol,Line,Content).
applyActionToL(L,_,[],L) :- !.
applyActionToL(Puz,Action,[P | R],N_Puz) :-
Action =.. Lst_Action,
append(Lst_Action, [L,P,Res],Actionwithargs),
Lit =.. Actionwithargs,
call(Lit),
applyActionToL(Res,Action,R,NewL).
但是applyActionToL和refP是由我的老师定义的,我想它的工作原理。
delNumAux(N, L, P, NewL) :-
refP(Puz, Pos, Content),
subtract(Content, Num, Content1),
swapandp(L, P, Content1, NewL).
delNum(N, L, Ps, NewL) :-
applyActionToL(L, delNumAux(Num), Ps, NewL).
编辑3:
我最终能够自己修复它!无论如何,谢谢你!
答案 0 :(得分:0)
swapandpropagate(L, P, [Content], OutL) :-
swap(L, P, Content, NewL),
relatedPs(P, Ps),
delNum(Content, NewL, Ps, OutL).