【論理】Prolog【初心者】

レス数が950を超えています。1000を超えると書き込みができなくなります。
1デフォルトの名無しさん
垢版 |
2010/11/06(土) 13:00:56
Prolog初心者のスレ

これは良い言語だ…
961デフォルトの名無しさん
垢版 |
2021/12/03(金) 21:44:45.76ID:E2QPyYLa
A: Dはうそつきです
B: AとDのどちらかは本当のことを言っています
C: Bの言っていることは本当です
D: 私はうそつきではありません

正直者は必ず本当のことを言っています。
うそつきは必ずうそをつきます。
うそつきはいったい誰?

↑この問題って高階述語になるから一階述語論理しか扱えないPrologでは解けないって理解でいいの?
そうだとしたら現代ではコンピューターでどうやって解くの?
2021/12/03(金) 23:00:48.21ID:Oj6t+xnM
prologは高階述語も書けるよ
2021/12/04(土) 06:16:48.61ID:CAsz35to
>>962
実装選ぶ必要ありますか?どれでも可能?
2021/12/04(土) 07:37:52.32ID:RAd/NC6B
よく分からんけど高階論理は不要で、制約論理で解けるんじゃないか
https://www.swi-prolog.org/pldoc/man?section=clpb

Aの発言は Aが真ならDは偽、Aが偽ならDは真という制約になり、これは A=:=(~D) と表せる
Bの発言は B=:=(A+D)、Cの発言は C=:=B、Dの発言は D=:=D と表せる
まとめると ?- sat((A=:=(~D)) * (B=:=(A+D)) * (C=:=B) * (D=:=D)). となり答は
B = C, C = 1, sat(A=\=D). となる
これはBとCは正直、AとDのうち一人は正直でもう一人は嘘つきだけどどちらが嘘つきかは分からないということ
2021/12/04(土) 23:56:43.15ID:CAsz35to
ありがとうございます
文章題からこの制約を書き下せる自信がない…(|||´Д`)
966964
垢版 |
2021/12/06(月) 19:23:33.90ID:JCSphZpm
>>965
正直者は必ず本当のことを言い、うそつきは必ずうそをつくという条件があるので
Aが正直者であるかどうかとAが言っていることが正しいかどうかの真偽は同じになるということで、それを制約論理の式で表すだけ
A=:=(~D)は、A(Aが正直者であること)と(~D)(Aの発言内容「Dは嘘つきだ」)の真偽が一致している(=:=)ということ
Aが真なら(~D)も真だし、Aが偽なら(~D)も偽
他の3人についても同様
これをリンク先にある制約論理で表す
0   偽
1   真
~P   not P
P*Q  P and Q
P+Q  P or Q
P=<Q  PならばQ
P=:=Q  PとQの真偽は同じ
P=\=Q  PとQの真偽は異なる
967964
垢版 |
2021/12/06(月) 19:33:58.30ID:JCSphZpm
制約論理を使わない(使えない)場合はどうしたらいいんだろ
d:-d.なんて書いても無限ループになるだけだし
レス数が950を超えています。1000を超えると書き込みができなくなります。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況