2017-11-23 6 views
0

こんにちは:)初心者からプロローグ。 (;)/ 2' が間違って何Swi-Prolog:静的プロシージャ `(;)/ 2 'を変更する権限がありません

`静的な手順を変更する権限がありません:これはエラーを生成

dog(rex). 
owns(bill,rex). 
animallover(X):-owns(X,Y),dog(Y). 
not(beat(X,Y)):-animallover(X),isAnimal(Y). 
beat(bill,tom);beat(bull,tom). 
iscat(tom). 
isAnimal(X):-iscat(X). 

私はこのコードを持っていますか?

ありがとうございました。

dog(rex). 
owns(bill,rex). 
animallover(X):-owns(X,Y),dog(Y). 
notbeat(X,Y):-animallover(X),isAnimal(Y). 
not(notbeat(bill,tom),notbeat(bull,tom)). 
iscat(tom). 
isAnimal(X):-iscat(X). 

これは問題を解決します。しかし、我々は質問に答えたいと思う"誰がトムに当たったの?"

そのように我々は唯一

?- nothit(X,tom). 

を求めることができ、これは法案をもたらすであろう。

私は誰がトムに命中したのかを尋ねるために、コードをどのように変更できますか?

+0

まず、ヒット*が何を意味するかを定義する必要があります。 *についての情報はcat *、*は動物*、* dog *、* owns *、* notbeat *の情報を参照してください。しかし、これらの述語や事実の点でヒット*とは何を意味しますか?それが立てば、これはあまり意味がありません。 – lurker

+0

ああ、私は間違いをしました。私は '?-notbeat(X、tom)' と聞いてみたい。とにかく。それは、Xがビート/ヒットしないことを意味するはずです – Peter

+0

'not(notbeat(bill、tom)、notbeat(bull、tom))'という意味ですか? – lurker

答えて

0
ラインで

beat(bill,tom);beat(bull,tom). 

あなたは「ビルがトムやブルトムを打つビート」を意味するように見えます。

しかし、プロローグのルールでは、代わりに;を再定義しようとしていますが、これは許可されておらず、事実として「Bill beat Tom or Bull beat Tom」と書くことはできません。

+0

それ以外はどうやったらいいですか? – Peter

2

問題の原因は、あまり言語では構文エラーが発生しますが、構文的には有効ですが意味がないPrologです。

あなたのコードのこの部分は完全に罰金です:

dog(rex). 
owns(bill, rex). 
animallover(X) :- owns(X, Y), dog(Y). 

空白は無料です。 :)

これはあなたの最初の問題である:私はあまりにも長いプロローグを行ってきたので、ここで言うしようとしているかわからないんだけど

not(beat(X,Y)) :- animallover(X), isAnimal(Y). 

not(Q) :- Q = beat(X, Y), ... 
つまり

あなたはここで定義されている手順ではなくbeat/2とは何よりも、not/1です:しかし、あなたはここで何を言っているか、少し異なる述べ、これです。あなたは頭の中にあまりにも多くのものを持っています。これは、初心者のための珍しい問題のようなものです。通常、他の言語に暴露されている人は、左側よりも:-の右側にあまりにも多くの割り当てを行うという誤りを犯すでしょう。

いずれにしても、Q :- Pを読み取る別の方法は、「Qを証明するには、まずPを証明する必要があります。これがPrologの考え方です。あるいは、「Pなら、私はQを終えることができます。だから、プロローグにnotという結論を出す方法を教えています。これはほとんど意味がありません。ホーン節と呼ばれるもので

beat(bill, tom); beat(bull, tom). 

Prologのお得な情報:エラーが発生したあなたの次の行への今

、。一般的なホーン節はQ :- Pのように見えますが、:- Pを省略すると、通常はファクトと呼ばれます。この場合、その行にあるすべてのものが一つの事実です。

A ; B :- A = beat(bill, tom), B = beat(bull, tom). 

あなたは本質的に、ここ;/2を再定義しようとしている、とプロローグが原因;があまりにもあることを許可していません。その式の頭部はそう、あなたが実際に書いたことはこれで、;であることが判明します重要。おそらくここで意味していたのは、2つの事実を分ける期間でした:beat(bill, tom). beat(bull, tom).

私はこれがあなたを悩ますのを助けることを望みます。

+0

私は「ビルビートトムかブルはビートトム」と言いたいと思っていました。つまり、「ビート(請求書、トム)」と言っています。ビート(ブル、トム)はここではあまり意味がない。 – Peter

+0

述語やクエリの外側ではそれを言うことはできません。 –

関連する問題