如何在Prolog中获得下一个ascii char?

时间:2016-10-20 07:33:29

标签: prolog

我想要一个像这样的谓词:

public class Login implements IBaseModel {
    public String username, password;

    public Login(String username, String password) {
        this.username = username;
        this.password = password;
    }

    public String getUsername() {
        return this.username;
    }

    public String getPassword() {
        return this.password;
    }
}

我可以这样称呼:

public class LoginViewModel implements IViewModel {
    private Subscription subscription;
    private ILoginDataListener dataListener;
    private Login login;

    Context context;


    String getUserName() {
        return this.login.getUsername();
    }

    LoginViewModel(Context ctx, Login login) {
        this.context = ctx;
        this.login = login;
    }

    public void onClickSubmit(View view) {
        Toast.makeText(context, "From View Model username is " + this.login.getUsername() + " the password " + this.login.getPassword(), Toast.LENGTH_SHORT).show();

        Toast.makeText(context, "From View Model", Toast.LENGTH_SHORT).show();

        loginRequest("Rajendra", "12345");
    }

    public void updateValue(View view) {
        this.login.password = "dummy";
        this.login.username = "simplefool";
    }

    @Override
    public void destroy() {

        if (subscription != null && !subscription.isUnsubscribed()) subscription.unsubscribe();
        subscription = null;
        context = null;
        dataListener = null;    
    }
}

它会给我/wp-admin/

不幸的是,您似乎无法对Prolog中的字符进行此算术运算。欢呼声。

1 个答案:

答案 0 :(得分:1)

如果您只想覆盖可打印的ASCII字符(32-127),您只需创建一个包含所有字符的“表格”并将其放入数据库即可。这只是一个小例子:

% space is the first printable ASCII character
asciichar_succ(' ', '!').
asciichar_succ('!', '"').
% ...
asciichar_succ(a, b).
asciichar_succ(b, c).
% ...
asciichar_succ('}', '~').

将此添加到数据库的一种方法是使用编译时术语扩展,例如:

term_expansion(asciichar_succ(_, _), Chars) :-
        findall(asciichar_succ(C0, C1), asciichar_next(C0, C1), Chars).

asciichar_next(C0, C1) :-
        between(32, 125, Code0),
        succ(Code0, Code1),
        char_code(C0, Code0),
        char_code(C1, Code1).

asciichar_succ(_, _).

当我将它放在文件char_succ.pl中,并从SWI-Prolog顶层加载此文件时,我得到:

?- [char_succ].
true.

?- asciichar_succ(a, X).
X = b.

?- asciichar_succ(X, '"').
X = !.

?- listing(asciichar_succ/2).
asciichar_succ(' ', !).
asciichar_succ(!, '"').
asciichar_succ('"', #).
asciichar_succ(#, $).
asciichar_succ($, '%').
asciichar_succ('%', &).
% ...
asciichar_succ(?, @).
asciichar_succ(@, 'A').
asciichar_succ('A', 'B').
asciichar_succ('B', 'C').
% ...
asciichar_succ(y, z).
asciichar_succ(z, '{').
asciichar_succ('{', '|').
asciichar_succ('|', '}').
asciichar_succ('}', ~).

true.

这样做有一个非常好的属性:只要两个参数中至少有一个是基础的,谓词就是确定性的,不会留下任何选择点。换句话说,asciichar_succ/2是一种“真正的关系”。在运行时,你绝对可以通过算术获得相同的最终结果,但是要做到正确会有点毛躁。