我有问题。 我有5个常数。
C(1).
C(2).
C(3).
C(4).
C(5).
我有一个名为"" check"收到两个论点。
示例:
check( [C(1), C(3), C(4), _, C(5)], ListFinal).
现在它应该给我
ListFinal = [C(1), C(3), C(4), C(2), C(5)].
我该怎么做?如何检查那个黑色空间放在那里,我还没有使用过?可以更改常量的实现。
答案 0 :(得分:3)
你可以尝试
check( [] , [] ) .
check( [c(X)|Xs] , [c(X)|Rs] ) :- c(X) , check(Xs,Rs) .
您也可以查看findall/3
。
但是你应该注意,你的'常数'不是prolog中的常量。你写它们的方式是事实。你列出的那些语法在语法上并不有效Prolog:一个术语的算子必须是像c(3).
那样的单词 atom 或用'C'(3).
这样的单引号括起来的原子(虽然为什么有人会自愿选择这样做的事情超出我的范围。)
答案 1 :(得分:3)
check(L, C) :-
check(L, [], C).
check([], _, []).
check([c(X)|T], A, [c(X)|C]) :-
c(X),
\+ memberchk(c(X), A),
check(T, [c(X)|A], C).
一些测试:
| ?- check([_, c(3), c(4), _, c(5)], ListFinal).
ListFinal = [c(1),c(3),c(4),c(2),c(5)] ? a
ListFinal = [c(2),c(3),c(4),c(1),c(5)]
no
| ?- check([c(1), c(3), c(4), _, c(5)], ListFinal).
ListFinal = [c(1),c(3),c(4),c(2),c(5)] ? a
no
| ?-
这是DCG方法:
remap([c(X)|T], A) --> {c(X), \+ memberchk(c(X), A)}, [c(X)], remap(T, [c(X)|A]).
remap([], _) --> [].
check(L, C) :- phrase(remap(L, []), C).
答案 2 :(得分:2)
一旦纠正了语法,检查每个参数(使用maplist / 3很容易)
check(In, Out) :-
exclude(var, In, NoVars),
maplist(check_var(NoVars), In, Out).
check_var(In, X, Y) :-
var(X) -> c(Z), \+ memberchk(c(Z), In), Y = c(Z) ; Y = X.
用法示例
1 ?- check([c(1),X,c(3),c(5)],L).
L = [c(1), c(2), c(3), c(5)] ;
L = [c(1), c(4), c(3), c(5)] ;
false.