检查谓词

时间:2014-05-06 20:02:40

标签: prolog

我有问题。 我有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)].

我该怎么做?如何检查那个黑色空间放在那里,我还没有使用过?可以更改常量的实现。

3 个答案:

答案 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.