我正在努力做一些我认为应该非常简单的事情,但似乎不是在Prolog中!我想使List2等于List1,其中List2过去已被分配(即它不是变量)。
如果List2
是变量,我可以简单地统一List1
和List2
:
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
作为输入。
答案 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(旧列表)传递。