Swi-prolog,需要帮助来定义我的条件

时间:2017-04-30 20:59:47

标签: prolog

所以我有一个项目,我正在尝试创建一个有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:

我最终能够自己修复它!无论如何,谢谢你!

1 个答案:

答案 0 :(得分:0)

猜测:

swapandpropagate(L, P, [Content], OutL) :-
    swap(L, P, Content, NewL),
    relatedPs(P, Ps),
    delNum(Content, NewL, Ps, OutL).