2017-06-27 9 views
1

Neu bei Prolog. Ich möchte ein Programm, das 1 auf 0 und 0 bis 1 Swaps und beantwortet diese Frage:Prolog, Prädikat, das 1 bis 0 und 0 bis 1 tauscht und in eine Liste einfügt

?- swap([1,1,0,1,0,0,0,1], L2). 
L2 = [0,0,1,0,1,1,1,0] 
+7

Haben Sie überhaupt versucht, dass Sie zeigen können und eine bestimmte Frage zu stellen? – lurker

+2

Ich gebe ein paar Hinweise. Denken Sie darüber nach Regeln nach. Im Basisfall geht es darum, eine leere Liste auszutauschen, 'swap ([], []).' (Eine vertauschte leere Liste ist auch eine leere Liste.). Dann ein rekursiver Fall. Zum Beispiel: swap ([1 | X], ...): - ... 'Wie sieht' ... 'aus, wenn das erste Argument' [1 | X] 'ist (eine Liste mit 1 im Kopf und der Schwanz der Liste ist 'X')? – lurker

Antwort

6
complement(0, 1). 
complement(1, 0). 

swap(X, Y) :- maplist(complement, X, Y). 
+0

Danke für die Antwort, aber ich versuche es rekursiv und ohne maplist/3. Gibt es eine andere Art und Weise? – Mitsos

+3

@Mitsos Ja, es gibt ein paar andere Möglichkeiten, dies rekursiv zu tun. Sie können sich [99 Prolog Probleme] (http://www.ic.unicamp.br/~meidanis/courses/mc336/2009s2/prolog/problemas/) ansehen und sich auf die Beispiele für die Listenverarbeitung konzentrieren, um eine Idee zu bekommen Anfang. An diesem Punkt ist es schwer zu sagen, wie viel Prolog Sie kennen, und dies ist keine Tutorialseite für den Start von Prolog. Es ist mehr für das Stellen bestimmter Codierungsfragen. – lurker

3

A CLPFD Lösung, die ordnungsgemäß in alle Richtungen, für Nachschlagewerken:

:- use_module(library(clpfd)). 

swap(X, Y) :- 
    maplist(#\=, X, Y), 
    X ins 0..1, 
    Y ins 0..1. 

Speziell :

?- swap(X,Y). 
X = Y, Y = [] ; 
X = [_2640], 
Y = [_2658], 
_2640 in 0..1, 
_2640#\=_2658, 
_2658 in 0..1 ; 
X = [_3200, _3206], 
Y = [_3224, _3230], 
_3200 in 0..1, 
_3200#\=_3224, 
_3224 in 0..1, 
_3206 in 0..1, 
_3206#\=_3230, 
_3230 in 0..1 ; 
… 

funktioniert ordnungsgemäß, wenn swap/2 von der anderen Antwort nicht:

?- swap2(X,Y). 
X = Y, Y = [] ; 
X = [0], 
Y = [1] ; 
X = [0, 0],  % Doesn't enumerate ([1],[0]), etc. 
Y = [1, 1] ; 
X = [0, 0, 0], 
Y = [1, 1, 1] ; 
… 
+0

Probieren Sie 'length (X, _), swap (X, Y) .' mit dem' swap' aus meiner Antwort für eine faire Aufzählung aus. – danlei

+1

@danlei Dies erzeugt endlose Schleifen beim Bactracking für z.B. 'length (X, _), swap2 (X, [1,0]).' – Fatalize

+1

Nun, ich meinte für die Generierung die allgemeinste Abfrage, aber ja - fair genug. – danlei