以前试过,但对我来说仍然有点乱 . 认为这是最长的后续,但实际上并非如此 . 所以用更好的例子来写它 . 我正在尝试编写一个Prolog谓词来比较两个字符串,看它们是否具有相同的元素并将它们打印出来(每个成员只有一次) . 目前我已经写了这个以将字符串放入2个不同的列表中以便于检查:
但是,我无法找到正确的方法来比较这两个列表中的每个元素,无论它们在哪里 . 我找到了比较的方法,直到它找到一个并且它返回true,但我需要它来比较两个列表中的每个元素并输出它们 . 我知道它与头部有关并比较它们,然后将下一个第一个列表成员添加为新头等 . 但我无法找到一种方法来做到这一点 . 此外,交叉点有点做我需要的,但它给了我每个元素(甚至多个时间) . 我需要它在找到匹配元素后停止,因此它只能找到它们一次 .
plates(X,Y,Mem,Num):-
atom_chars(X,Xs),
atom_chars(Y,Ys),
compare_list(Xs,Ys,Mem),
length(Mem,Num).
compare_list([], _, []).
compare_list([H1|T1], L, R) :-
(check_element(H1, L)
->R = [H1|R]
;R = R
),
compare_list(T1, L, R).
check_element(_, []).
check_element(X, [H|T]) :-
X = H,
check_element(X, T).
Example1:
?-plates('111AXB','112XXX', Mem, Num).
应输出:
Mem = ['1','1','X'],
Num = 3.
Example2:
?-plates('456XYZ','678ABC', Mem, Num).
应输出:
Mem = ['6'],
Num = 1.
我试着在这里实施解决方案:PROLOG Comparing 2 lists
My test:
?- plates('ABC123','123ABC',Mem,Num).
我的输出:
Mem = [],
Num = 0.
预期:
Mem = ['A', 'B', 'C', '1', '2', '3'],
Num = 6.
但我无法按照我想要的方式工作...任何帮助都将非常感激!
1 回答
你可以这样写:
其中inter找到交集并检查第一个列表的元素是否在第二个列表中出现,然后将其添加到第三个列表并从第二个列表中删除它 . 一些示例: