2016-10-12 8 views
0

プロローグの推論力を使って、次のような問題を解決したい。プロローグのバイナリロジック

犯行現場では、ある日、警官が3人、a、b、cを捕まえました。警察は彼らを尋問定住する場合:

i) a says I am innocent 
ii) b says a is criminal 
iii) c says I am innocent. 

ITSは

i) Exactly one person speaks true. 
ii) Exactly one criminal is there. 

犯罪者であることが知られて誰?一階述語論理で問題上、モデルに :引数は、私たちが書くことができる刑事 とき C/1は述語で考えてみましょうがtrueを返す:

(not(c(a)),c(c)) ; (c(c),c(a)). 
c(a); c(b); c(c). 
(not(c(a)),not(c(b))) ; (not(c(a)),not(c(c))) ; (not(c(b)),not(c(c))). 

プロローグでは上記の文をモデル化した後、私は照会します:

?-c(X). 
it should return: 
X=c. 
But error I got: 
"No permission to modify static procedure `(;)/2'" 
+1

あなたは任意の公式を書いていますが、PrologはHornの公式、つまり '' 'fact'''や' 'head: - goal1、goal2、goal3.'''の形式しか受け入れません。また、あなたが人物「c」と述語「c」を持っていることはかなり混乱しています。 –

+0

はlambda.xy.x @私はNL1を記述しようとしています: は、FOLで を "正確に1つ、Bの間で、cは真話す": 「(ない(犯罪者(a))は、犯罪者(C) );(犯罪者(c)、犯罪者(a))。 およびNL2: 「a、b、cのうちのちょうど1つは、FOLにおいて であり、犯罪者(a);犯罪者(b);犯罪者(犯罪者(b)))、((犯罪者(a))ではなく、(犯罪者(c))ではない) 意味を同じにしながら構文的に正しいプロローグプログラムになるように、ホーン式でこれをどのように表現できますか? – user2976975

+0

あなたはそれをうまく動作しない式を直接変換しようとしています(例えば、述語犯罪者(X)が1つの解決策しか持たないようにするには、 "犯罪者(X) Y、X)、犯罪者(Y)」)。@topologicalsortは、あなたの状態空間を明示的にすることによって、あなたを正しい方向に向けています。 –

答えて

1

PROLOGは本当にホーン句で動作するので、形式head :- tailのものが必要です(:-は "if"となります)。

solve(Solution) :- 
    Solution = [a(_,_),b(_,_),c(_,_)], 
    generate(Solution), 
    validate(Solution). 

generateがあなたに整形Solutionを与える必要があります:

solve(Solution) :- ... 
%With a Solution looking something like: 
% solve(a(truth,innocent),b(false,criminal),c(false,innocent)). 

は、あなたがこのような何かをしたい生成し、これを解決するために一般的で合理的な方法である試験方法、使用するにはつまり、すべての変数に何らかの意味を持つ値(つまり、 false, true, criminal, innocent)が書き込まれた変数です。

validateは、ソリューションが指定した制約条件に一致するようにする必要があります。

solvegenerateの解決策の1つがvalidateの制約を超えた場合にのみ完了します。

生成およびテスト方法については、this tutorialを参照してください。

しかしホーン句ではないコードを書く場合は、this oneのようなPROLOG関数(OK、リレーション)の作成に関するチュートリアルが必要な場合があります。