我一直在寻找可以帮助我解决整个互联网问题的事情,但我还没有取得任何进展。我是逻辑编程的新手,英语不是我的第一语言,所以为任何错误道歉。
基本上我想要实现这个prolog程序:discord/3
,其中包含参数L1,L2列表和P,其中P是L1[P] != L2[P]
(在Java中)列表的索引。如果长度不同,则不配对的索引会失败。模式为(+,+,-) nondet
。
我找到了基本案例,但我似乎无法解决如何在递归调用中定义P的问题。
discord(_X,[],_Y) :-
fail.
discord([H1|T1],[H1|T2],Y) :-
???
discord(T1,T2,Z).
discord([_|T1],[_|T2],Y) :-
???
discord(T1,T2,Z).
上面的两个条款是我的目标,但我不知道如何表示Y - 和Z - 以便函数实际记住原始列表的长度。我一直在考虑使用nth/3
最终使用assert
,但我不确定将它们放在程序中的哪个位置。
我确信必须有一个更简单的解决方案。提前谢谢!
答案 0 :(得分:0)
您可以通过两种方式解决此问题。首先,更具说明性的方法是使用nth1/3
枚举两个列表的索引元素并使用dif/2
来确保两个元素不同:
?- L1 = [a,b,c,d],
L2 = [x,b,y,d],
dif(X, Y),
nth1(P, L1, X),
nth1(P, L2, Y).
X = a, Y = x, P = 1 ;
X = c, Y = y, P = 3 ;
false.
您也可以尝试同时浏览这两个列表并保留一个计数器:
discord(L1, L2, P) :-
discord(L1, L2, 1, P).
discord([X|_], [Y|_], P, P) :-
dif(X, Y).
discord([_|Xs], [_|Ys], N, P) :-
succ(N, N1),
discord(Xs, Ys, N1, P).
然后,从顶层:
?- discord([a,b,c,d], [a,x,c,y], Ps).
Ps = 2 ;
Ps = 4 ;
false.