論理システムの修正


16

論理ステートメントのセットが提供されます。あなたの課題は、他のものと矛盾するものを削除することですが、最適な方法で(つまり、最小限のステートメントを削除することです)。

チャレンジ

ステートメントのリストを入力として受け取り、ソリューションがあるように最小限のステートメントを削除て残りを出力するプログラムまたは関数を作成します。

論理

ステートメントは、変数 A-Zとそれらの間の演算子で構成されます。

5つの演算子があります:-(not)、v(or)、^(and)、->(if)、および<->(iff)。

真理値表:

A | B | -A | AvB | A^B | A->B | A<->B
0 | 0 |  1 |  0  |  0  |   1  |   1
0 | 1 |  1 |  1  |  0  |   1  |   0
1 | 0 |  0 |  1  |  0  |   0  |   0
1 | 1 |  0 |  1  |  1  |   1  |   1

これらの演算子は括弧で結合できます()

A | B | -(AvB) | Av(-A) | A^(-A) | (AvB)->(-B)
0 | 0 |    1   |    1   |    0   |      1
0 | 1 |    0   |    1   |    0   |      0
1 | 0 |    0   |    1   |    0   |      1
1 | 1 |    0   |    1   |    0   |      0

論理システムは、1つ以上のステートメントで構成されます。

溶液ロジックシステムは、すべての状態である文が同時に真です。

論理システムの例:

AvB
-(A<->B)
(AvB)->(-B)

唯一の解決策A = 1, B = 0です。

A^B
-(B<->A)

これには解決策がありません。の組み合わせはなくAB両方のステートメントが真です。

入力

入力として一連のステートメントを受け取ります。これは、(便利な形式の)配列または改行で区切られた、またはスペースで区切られた文字列としてフォーマットされた、STDINまたは関数の引数を介して取得できます。

ステートメントは次の形式になります(ほぼABNFで)。

statement        = variable / operation
operation        = not-operation / binary-operation
not-operation    = "-" operand
binary-operation = operand binary-operator operand
operand          = variable / "(" operation ")"
variable         = "A"-"Z"
binary-operator  = "v" / "^" / "->" / "<->"

ステートメントの例:

A
Av(-B)
(A<->(Q^C))v((-B)vH)

出力

受け取った正確な形式で(場合によっては)縮小されたステートメントのセットを返す必要があります。繰り返しになりますが、リストは文字列の配列または改行で区切られた文字列またはスペースで区切られた文字列としてフォーマットできます。

ルール

  • 常に最小限のステートメントを削除する必要があります。考えられる解決策が複数ある場合は、そのうちの1つを出力します。
  • 入力には常に少なくとも1つのステートメントが含まれ、入力ではステートメントが繰り返されないと想定できます。
  • 出力に常にステートメントが含まれるとは限りません。(例を参照)
  • 標準の抜け穴を使用すると、答えが有効であることに矛盾するため、それらの1つを削除する必要があります。
  • これはであるため、バイト単位の最短回答が優先されます。

入力:

A^(-A)

出力:

(nothing)

入力:

A^B A<->(-B) A<->B

出力:

A^B A<->B

入力:

["AvB","A^B"]

出力:

["AvB","A^B"]

3
これが関連するかどうかはわかりませんが、この問題は、NP完全な最大セットパッキングに帰着します。
レイフウィラーツ

あなたの文法によると、例の3番目のステートメントは正しくありません(そうである(AvB)->-B必要があります(AvB)->(-B)
誇りに思ってhaskeller

@proudhaskellerありがとう、それを修正しました。
PurkkaKoodari

また、の括弧A<->(Q^C))v((-B)vHはミッシュマッシュです。
誇りに思ってhaskeller

@proudhaskeller再びありがとう。
PurkkaKoodari

回答:


3

ルビー、299の 298 283 279バイト

class Object;def * o;!self|o;end;def s;w=join.gsub(/\W/,"").chars.uniq;n=w.size;(0..2**n).any?{|i|n.times{|j|eval(w[j]+"=#{i[j]>0}")};all?{|e|eval([%w[<-> ==],%w[-> *],%w[- !],%w[^ &],%w[v |]].inject(e){|x,i|x.gsub(*i)})}}?self:combination(size-1).map(&:s).max_by(&:size);end;end
  • 式の配列が必要です。
  • 実行する場合は、ルビーの内部から$ VERBOSE = nilを設定して、定数の再定義に関する警告が多く表示されないようにします。
  • 実際に変数「v」も設定しますが、違いはありません。
  • 真理値を使用するのは、含意を除き、必要なすべての演算子が既にあるためです。残念ながら、Rubyにはブール型クラスがないため、含意を得るためにObjectをモンキーパッチする必要があります:)
  • 大文字の変数をすべて設定するだけで短縮できますが、実行に膨大な時間がかかります。おそらくそれについての質問には注意が必要です。

ゴルフをしていない:

class Object
  def * o 
    !self|o
  end 
end

def sat? exs 
  #exs: an array of expressions
  s=[%w[<-> ==], %w[-> *], "-!", "^&", %w[v ||]]

  w=exs.join.gsub(/\W/,"").chars.uniq #variable names
  n=w.size
  if (0...2**n).any? {|i|
    n.times do |vi|
      eval("#{w[vi]}=#{i[vi]==1}")
    end 
    exs.all?{|ex|eval(s.inject(ex){|x,i|x.gsub(i[0],i[1])})}
  }
    exs
  else
    exs.combination(exs.size-1).map{|sm|sat?(sm)}.max_by(&:size)
  end
end

5

Python 3、431バイト

現時点ではあまりゴルフをしていませんが、答えを出してボールを転がすと思います。ここで試してみてくださいg()が主な機能です。

import re,itertools as H
def g(i):
 y=re.sub(r'\W','',''.join(set(i)).upper());l=i.split()
 def e(s):
  def f(a):
   for v,w in a:exec(v+'='+w)
   return eval(re.sub('[^A-Z()]+',lambda x:{'v':' or ','^':'*','<->':'==','->':'<=','-':'not '}[x.group()],s))
  return[c for c in H.product("01",repeat=len(y))if f(zip(y,c))]
 for n in range(len(l),-1,-1):
  for q in H.combinations(l,n):
   if e('('+')^('.join(q)+')'):return' '.join(q)

とてもかっこいい。私はそれを428に落としました:repl.it/BCzp
PurkkaKoodari

真理値のモデリング方法に問題があります。たとえば、g( "A(AvA)<-> A")は入力を返す必要がありますが、A = 1の場合はAvA = 2であるため機能しません。
イブラヒムテンサー

ああ、そうですね、指摘してくれてありがとう。それらを比較するより短い方法を考えることができなかったので、今のところ「と」に戻しました。また、ゴルフの変更のおかげで、Pietu!
TheMadHaberdasher

私は信じvていますor
PurkkaKoodari

...はい。ありがとう。
TheMadHaberdasher
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.