2010-06-03 9 views
9

Operator rur w prologu zwraca jedną lub więcej głowic atomowych i listę ogonów.Co [a | b | c] ocenia w SWI-Prolog?

?- [a,b,c] = [a,b|[c]]. 
true. 

lęgowe wielu rur w jednym meczu można zrobić podobny do tego:

?- [a,b,c] = [a|[b|[c]]]. 
true. 

Co oznacza stwierdzenie [a|b|c] wnioskować o A, B i C?

EDIT

Jak dotąd, wszystko co mogę wywnioskować to:

?- [a,b,c] = [a|b|c]. 
false. 

jestem bardziej zainteresowany w dowolnych technik aby znaleźć odpowiedź, zamiast odpowiedzieć na to pytanie bezużyteczne borderline.

EDIT2
ja oczywiście nie jestem zbyt obeznany z prologu, proste zadanie odpowiedzi na moje pytanie ...

?- R = [a|b|c]. 
R = [a| (b'|'c)]. 

Co dokładnie dzieje się z (b'|'c)?

+1

Wygląda jak zadanie domowe. Jeśli tak, oznacz to jako tag. –

+3

Nie jestem zaznajomiony z Prologiem, ale dlaczego nie możesz napisać szybkiego programu do oceny? – Matchu

+3

Właściwie to nie, tylko interesujące pytanie, na które natknąłem się podczas nauki moich egzaminów semestralnych na uni: https://secure.csse.uwa.edu.au/run/help3242?p=np&a=99 Spędziłem trochę czasu moje pytanie wygląda ładnie, nadające się do egzaminu? :) – Ambrose

Odpowiedz

9

Odkąd” Twój wykładowca, oto moja odpowiedź.
(Och, i mogę potwierdzić, że to nie jest praca domowa, wiąże się to z egzaminem praktycznym).

Składnia [a|b|c] faktycznie nie wydaje się być standardowym Prologiem, a niektóre implementacje interpretują go inaczej. (Gdybym wiedział, że mógłbym tego nie używać.)

Niektórzy interpretują to jako [a|[b|c]]. (Jak zamierzałem.)

Ale z SWI Prolog (i prawdopodobnie innymi):

?- [a|b|c] = [a|[b|c]]. 
false. 

(b '|' c) jest właściwie skonstruowany przy użyciu '|' zamiast '.' jako lista będzie.Tak więc drugi | nie jest interpretowany jako część budowy listy w ogóle.

Aby to potwierdzić, co następuje powiedzie:

 
    ?- X=(b|c), [a|b|c] = [a|X]. 
    X = (b'|'c) . 

'|' tutaj wydaje się być inny operator binarny na warunkach tak jak '.'.

Zamiast [a|b|c] standardem w Prolog jest użycie [a,b|c].

(I postanowił tylko do korzystania [a|b|c] w paradygmat programowania, ponieważ bardziej bezpośrednio odnosi się do notacji a::b::c z F #, a my widzieliśmy tylko mały przebłysk Prologu. W przyszłości Chyba będę odnosić się do [a|[b|c]] a następnie dać [a,b|c] jako skrót.)

+0

Och, racja! Tak więc "[a | b | c]" to cukier syntaktyczny dla ''.' (A, (b '|' c))'!Więc operator '|' różni się od ':' tym, że ogon nie musi być koniecznie listą, tylko "rzeczą"? Nadal próbuję przełknąć, co to oznacza dla języka, aby ** nie ** miał typy ... – Ambrose

+1

Technicznie "'. "I' '| "' są operatorami. Oba mogą być zastosowane do dowolnych dwóch warunków, tworząc rodzaj pary - w przeciwieństwie do '::' w F #/ML, gdzie sprawdzanie typu upewnia się, że '::' jest używane tylko dla par głowy i odpowiedniego ogona. '' .'' jest prawie zawsze używane dla list, a składnia '[t1, t2 | t3] 'to skrót od' '.' (t1, '.' (t2, t3)) '. Jeśli 't3' jest w rzeczywistości' t4 | t5' wtedy to '|' nie jest częścią skrótu, więc dostajesz ''.' (t1, '.' (t2, (t4 '|' t5)))'. – RD1

+1

Który system interpretował "[a | b | c]" jako '[a | [b | c]'? Proszę zobaczyć moją odpowiedź na standard. – false

5

To nie jest oświadczenie, to wyrażenie, które nie implikuje niczego w odniesieniu do a, b lub . Po prostu tworzy niepoprawną listę.

Aby rozwinąć: Składnia [|] jest faktycznie cukrem syntaktycznym dla operatora .(). Listy są konstruowane wewnętrznie przez '.'(a,[]), ale ponieważ staje się to niezwykle uciążliwe, aby pisać od razu, możesz zamiast tego wpisać [a]. Tak więc operator . ma wziąć rzecz i listę, a następnie konstruuje dłuższą listę, ale ponieważ nie ma pisania, nikt nie uniemożliwia ci zastosowania go do dwóch atomów lub jakiejkolwiek innej pary rzeczy. Wynikiem jest struktura, w której niektóre operacje na listach kończą się pomyślnie, a inne zawodzą. Czasem jest to przydatne (myślę o drzewach binarnych), ale nie tak często, jak listy, dlatego nie ma w tym celu specjalnej składni odczytu.

(Tak samo dzieje się z operatorem w Lisp cons;. Jeśli google „niewłaściwe listy” jesteś odpowiedzialny, aby uzyskać o wiele więcej wyników o Lisp, ale zasada jest taka sama)

+0

Świetna odpowiedź, dzięki! Czy jest szansa, że ​​dałbyś mi wskazówkę podczas mojej drugiej edycji pytania, używając ''|''? – Ambrose

+0

Tak, z wyjątkiem tego, że w SWI Prolog (i prawdopodobnie innych) drugi "|" nie jest interpretowane jako ".". – RD1

5

W ISO-Prolog, [a|b|c] jest nieprawidłowa składnia. A w międzyczasie również w ramach SWI. Wygląda na to, że użyłeś starszej wersji. Niektóre systemy Prolog nadały temu terminowi pewną interpretację. Niestety, wszystkie różniły się bardzo precyzyjnym sposobem interpretacji tego terminu. Niektórzy jako [(a'|'b)|c] lub [a|(b'|'c)] lub ... cóż, dostaniesz to.

Powiązane z tym jest użycie paska jako operatora infix ('|')/2.

Z ISO/IEC 13211-1:1995/Cor.2:2012, Sprostowanie techniczne 2, opublikowane 2012-02-15 użycie paska | jako operatora infiksów jest teraz dokładnie zdefiniowany. Wcześniej należało cytować |. Tutaj is its draft.

Teraz '|' można zdefiniować jako operator Infix lecz o priorytecie powyżej 1000. W ten sposób niejednoznacznych przypadkach jako [a|b|c] pozostają składniowo nieważny, ale zastosowań | do DCGs i CHR są ważne.

Jeśli chcesz poznać składnię, wypróbowując ją, najlepiej jest użyć writeq/1 i write_canonical/1.

Najbardziej zgodny system w.r.t Składnia ISO-Prolog to GNU Prolog.

Powiązane problemy