Prolog:将列表复制到已分配的列表

时间:2015-06-01 10:19:26

标签: prolog

我正在努力做一些我认为应该非常简单的事情,但似乎不是在Prolog中!我想使List2等于List1,其中List2过去已被分配(即它不是变量)。

如果List2是变量,我可以简单地统一List1List2

List2=List1.

但是在我的情况下List2已经存在(并且不等于List1),所以这个谓词失败了。

我也尝试了以下内容:

copy(List1,List2).
copy(L,R) :- CCp(L,R).
CCp([],[]).
CCp([H|T1],[H|T2]) :- CCp(T1,T2).

但这也失败了,大概是出于同样的原因?

有人能引导我朝着正确的方向前进吗?我正在教自己Prolog如此道歉,如果我只是忽略了一些简单的事情。感谢。

上下文:

每次运行谓词L时,我都会尝试将一个术语List2添加到列表add_to_list中。到目前为止,我有以下内容:

add_to_list(List2,List1):-
generateL(L),
( \+ memberchk(L,List2) -> List1=[L|List2]  ; List1 = List2).

所以我希望有一种方法可以重新分配List2以便等于List1,但也许这不是Prolog的思维方式。

相反,我现在尝试按如下方式传递List1:

my_predicate(List1,ListOut):-
    add_to_list(List1,ListOut),
    write(ListOut),nl,nl.

add_to_list(List2,List1):-
   generateL(L),
   ( \+ memberchk(L,List2) -> List1=[L|List2]  ; List1 = List2).

当我按如下方式调用my_predicate时,这是有效的:my_predicate([],ListOut),即List1为空(因为它是开始的)。但我现在希望能够使用my_predicate随后致电my_predicate(List1,ListOut),以便将预先存在的List1作为输入。

2 个答案:

答案 0 :(得分:1)

绑定后,您无法“修改”变量。请参见示例:

Forcing variable to reassign (Prolog)

Prolog: Changing a variable between two known values consecutivly

当对两个已绑定的变量执行规则“复制”或“ccp”时,prolog将验证它们是否等于,如果没有则失败,但不重新分配。如果其中一些没有约束,它将使它们相等。如果其中一些部分未绑定(某些列表项未绑定),则它将使未绑定项等于并验证剩余项。

如果您提供问题的完整背景,我们可以建议替代方案。

答案 1 :(得分:0)

感谢您指导我正确的方向 - 我最终通过递归调用my_predicate设法解决了这个问题,如下所示:

 my_predicate(List2,Num):-
     add_to_list(List2,List1),
     (  Num_new < 99 -> my_predicate(List1,Num_new) ; true  ).

 add_to_list(List2,List1):-
     generateL(L),
     ( \+ memberchk(L,List2) -> List1=[L|List2]  ; List1 = List2).

即。基本上,在每个递归循环中,List1(新列表)作为List2(旧列表)传递。