检查谓词 [英] Check predicate

查看:35
本文介绍了检查谓词的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有问题.我有 5 个常量.

I've a problem. I have 5 constants.

C(1).
C(2).
C(3).
C(4).
C(5).

我有一个名为check"的谓词,它接收两个参数.

And I've a predicate named "check" that receives two arguments.

示例:

check( [C(1), C(3), C(4), _, C(5)], ListFinal).

现在它应该给我

ListFinal = [C(1), C(3), C(4), C(2), C(5)].

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

How do I do this? How to check for that black space to put there, the constant I haven't used? It is possible to change the implementation of the constants.

推荐答案

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 方法:


Here's a DCG approach:

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).

这篇关于检查谓词的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆