3

tl:dr - Prolog の 1 つのバージョン (SWI) では正常に動作しますが、別のバージョン (TuProlog) では正常に動作しない 1 行の Prolog があります。

SWI prolog から Tuprolog にスクリプトを移植しています。(TuProlog は最近大きな更新を行い、両方のバージョンで同じ動作をします)

以下の Java セットアップを使用してスクリプトを TuProlog に入れると、「文字列全体を 1 つの用語として読み取れませんでした」というエラーが表示されます。

したがって、スクリプトを次のように縮小するまで、スクリプトを削減します (二分探索を効果的に使用します)。

iterm3(Term) --> "'", notquote(Cs), "'", { name(Term1,Cs), Term = q(Term1) }.

これは、次の出力でswiplをうまく通過します...

cobrakai:~ josephreddington$ swipl -s /Users/josephreddington/Documents/workspace/com.plancomps.prolog.helloworld/caml-light-dynamics/Tools/Prolog/temp.pl% library(swi_hooks) compiled into pce_swi_hooks 0.00 sec, 3,992 bytes% /Users/josephreddington/Documents/workspace/com.plancomps.prolog.helloworld/caml-light-dynamics/Tools/Prolog/temp.pl compiled 0.00 sec, 1,720 bytes
Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 5.10.5)
Copyright (c) 1990-2011 University of Amsterdam, VU Amsterdam
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to redistribute it under certain conditions.
Please visit http://www.swi-prolog.org for details.

For help, use ?- help(Topic). or ?- apropos(Word).

?- 

しかし、Tuprolog で「文字列全体を 1 つの用語として読み取ることができませんでした」というエラーが返されます。

付録: 使用されるコード:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import alice.tuprolog.NoMoreSolutionException;
import alice.tuprolog.NoSolutionException;
import alice.tuprolog.Prolog;
import alice.tuprolog.SolveInfo;
import alice.tuprolog.Theory;

public class EntireStringForStackOverflow {
    public static void main(String[] args) throws Exception {
        Prolog engine = new Prolog();
        engine.loadLibrary("alice.tuprolog.lib.DCGLibrary");
        engine.addTheory(new Theory(readFile("temp.pl")));
    }

    private static String readFile(String file) throws IOException {
        BufferedReader reader = new BufferedReader(new FileReader(file));
        String line = null;
        StringBuilder stringBuilder = new StringBuilder();
        String ls = System.getProperty("line.separator");
        while ((line = reader.readLine()) != null) {
            stringBuilder.append(line);
            stringBuilder.append(ls);
        }
        return stringBuilder.toString();
    }
}
4

2 に答える 2

0

Tuprolog で一重引用符を引用する必要があると思います。私は試してみます

iterm3(Term) --> "\'", notquote(Cs), "\'", { name(Term1,Cs), Term = q(Term1) }.

編集ここで、tuProlog DCG のドキュメントがどこにあるのかわからないことを認めなければなりませ。上記の役に立たない変更を提案した理由がわかります。

iterm3(Term) --> ['\''], notquote(Cs), ['\''], { name(Term1,Cs), Term = q(Term1) }.

つまり、二重引用符定数が tuProlog で禁止されているかどうかを試行錯誤して検証します...

于 2013-07-22T15:05:24.733 に答える
0

一般的に言えば、tuProlog で単一引用符を含む用語を記述する正しい方法は、上の方、つまり "'" (または、別の混合例を提供するために "a'b") です。ただし、そのような用語は現在 DCG ライブラリでは処理されていません。

于 2013-12-06T13:41:50.697 に答える