Prolog程序类型错误

时间:2014-04-09 09:12:00

标签: prolog

这是我目前正在研究的任务之一(是的,这是家庭作业):

moveSouth([_],_,_Num,_Moves,_Time).
moveSouth(Members,SouthGrp,Num,Moves,Time) :-
    member(X1/Y1,Members),
    member(X2/Y2,Members),
    X1 @< X2,
    (((NewTime is Time+Y1),(Y1>=Y2));((NewTime is Time+Y2),(Y1<Y2))),
    NewTime =< Num,
    subtract(Members,[X1/Y1,X2/Y2],NewFam),
    append(SouthGrp,[X1/Y1,X2/Y2],NewSouthGrp),
    append(Moves,[X1+X2],NewMoves),
    moveNorth(NewFam,NewSouthGrp,Num,NewMoves,NewTime).

 moveNorth(Member,SouthGrp,Num,Moves,Time) :-
    member(X1/Y1,SouthGrp),
    NewTime is Time+Y1,
    select(X1/Y1,SouthGrp,NewSouthGrp),
    moveSouth([X1/Y1|Member],Num,NewSouthGrp,[Moves|X1],NewTime).

 moveFamily(Name,Num,_Moves,_Time) :-
    family(Name,Members),
    moveSouth(Members,[],Num,[],0).

我在这里要做的是移动名称列表,其名称/时间属性, 在南边,每次我只能移动2个成员到南方,然后需要 将其中一名南方成员移回北方。

现在SWI-Prolog正在给我:

ERROR: =</2: Type error: `character' expected, found `mother/2'"

我理解这意味着=<运营商的类型是错误的。我不明白的是导致这种情况发生的原因。

PS:我使用的事实是:

family(original, [father/1, mother/2, child/5, granny/10]).

我使用的查询是:

moveFamily(original,19,Moves,Time).

1 个答案:

答案 0 :(得分:1)

1

代码中的以下行假定X1/Y1X2/Y2始终在成员列表中彼此相邻(按此顺序):

subtract(Members, [X1/Y1,X2/Y2], NewFam),

但从成员列表中选择X1/Y1X2/Y2的方式表明情况并非如此:

member(X1/Y1, Members),
member(X2/Y2, Members),

2

[Moves|X1]中存在另一个错误,其中X1根本不需要列表。

3

然后您提出问题的具体错误:在对moveSouth/4的一次调用中,您已交换了导致INTEGER =< LIST的第二个和第三个参数。

希望这有帮助!