Skip to main content

argumentation_schemes/catalog/
popular.rs

1//! Popular schemes: social proof, tradition, precedent.
2//!
3//! Ref: Walton, Reed & Macagno 2008, Chapter 9 + Appendix 1.
4
5use crate::catalog::POPULAR_ID_OFFSET;
6use crate::critical::CriticalQuestion;
7use crate::scheme::*;
8use crate::types::*;
9
10/// Return all popular schemes.
11pub fn all() -> Vec<SchemeSpec> {
12    vec![
13        argument_from_popular_opinion(),
14        argument_from_tradition(),
15        argument_from_precedent(),
16        argument_from_established_rule(),
17    ]
18}
19
20/// Argument from Popular Opinion (Walton 2008 p.311).
21pub fn argument_from_popular_opinion() -> SchemeSpec {
22    SchemeSpec {
23        id: SchemeId(POPULAR_ID_OFFSET),
24        name: "Argument from Popular Opinion".into(),
25        category: SchemeCategory::Popular,
26        premises: vec![
27            PremiseSlot::new("claim", "The claim widely accepted", SlotRole::Proposition),
28            PremiseSlot::new(
29                "population",
30                "The group that accepts the claim",
31                SlotRole::Agent,
32            ),
33        ],
34        conclusion: ConclusionTemplate::positive(
35            "?claim is plausible based on popular acceptance by ?population",
36            "?claim",
37        ),
38        critical_questions: vec![
39            CriticalQuestion::new(
40                1,
41                "What evidence supports that ?population actually accepts ?claim?",
42                Challenge::PremiseTruth("population".into()),
43            ),
44            CriticalQuestion::new(
45                2,
46                "Is ?population's acceptance based on good reasoning?",
47                Challenge::RuleValidity,
48            ),
49            CriticalQuestion::new(
50                3,
51                "Is ?claim the type of claim that popular acceptance makes more plausible?",
52                Challenge::RuleValidity,
53            ),
54        ],
55        metadata: SchemeMetadata {
56            citation: "Walton 2008 p.311".into(),
57            domain_tags: vec!["popular".into()],
58            presumptive: true,
59            strength: SchemeStrength::Weak,
60        },
61    }
62}
63
64/// Argument from Tradition (Walton 2008 p.316).
65pub fn argument_from_tradition() -> SchemeSpec {
66    SchemeSpec {
67        id: SchemeId(POPULAR_ID_OFFSET + 1),
68        name: "Argument from Tradition".into(),
69        category: SchemeCategory::Popular,
70        premises: vec![
71            PremiseSlot::new("practice", "The traditional practice", SlotRole::Action),
72            PremiseSlot::new(
73                "tradition",
74                "Evidence of longstanding tradition",
75                SlotRole::Property,
76            ),
77        ],
78        conclusion: ConclusionTemplate::positive(
79            "?practice should be continued based on ?tradition",
80            "continue_?practice",
81        ),
82        critical_questions: vec![
83            CriticalQuestion::new(
84                1,
85                "Has ?practice actually been a longstanding tradition?",
86                Challenge::PremiseTruth("tradition".into()),
87            ),
88            CriticalQuestion::new(
89                2,
90                "Were the circumstances that justified ?practice still applicable?",
91                Challenge::RuleValidity,
92            ),
93            CriticalQuestion::new(
94                3,
95                "Have conditions changed such that ?practice is no longer appropriate?",
96                Challenge::AlternativeCause,
97            ),
98        ],
99        metadata: SchemeMetadata {
100            citation: "Walton 2008 p.316".into(),
101            domain_tags: vec!["popular".into(), "tradition".into()],
102            presumptive: true,
103            strength: SchemeStrength::Moderate,
104        },
105    }
106}
107
108/// Argument from Precedent (Walton 2008 p.319).
109pub fn argument_from_precedent() -> SchemeSpec {
110    SchemeSpec {
111        id: SchemeId(POPULAR_ID_OFFSET + 2),
112        name: "Argument from Precedent".into(),
113        category: SchemeCategory::Popular,
114        premises: vec![
115            PremiseSlot::new("precedent_case", "The precedent case", SlotRole::Property),
116            PremiseSlot::new("current_case", "The current situation", SlotRole::Property),
117            PremiseSlot::new(
118                "action",
119                "The action taken in the precedent",
120                SlotRole::Action,
121            ),
122        ],
123        conclusion: ConclusionTemplate::positive(
124            "?action should be taken in ?current_case as it was in ?precedent_case",
125            "do_?action",
126        ),
127        critical_questions: vec![
128            CriticalQuestion::new(
129                1,
130                "Is ?current_case sufficiently similar to ?precedent_case?",
131                Challenge::DisanalogyClaim,
132            ),
133            CriticalQuestion::new(
134                2,
135                "Was ?action the right decision in ?precedent_case?",
136                Challenge::PremiseTruth("precedent_case".into()),
137            ),
138            CriticalQuestion::new(
139                3,
140                "Are there relevant differences between ?precedent_case and ?current_case?",
141                Challenge::DisanalogyClaim,
142            ),
143        ],
144        metadata: SchemeMetadata {
145            citation: "Walton 2008 p.319".into(),
146            domain_tags: vec!["popular".into(), "legal".into()],
147            presumptive: true,
148            strength: SchemeStrength::Moderate,
149        },
150    }
151}
152
153/// Argument from Established Rule (Walton 2008 p.318).
154pub fn argument_from_established_rule() -> SchemeSpec {
155    SchemeSpec {
156        id: SchemeId(POPULAR_ID_OFFSET + 3),
157        name: "Argument from Established Rule".into(),
158        category: SchemeCategory::Popular,
159        premises: vec![
160            PremiseSlot::new("rule", "The established rule or law", SlotRole::Property),
161            PremiseSlot::new("case", "The case the rule applies to", SlotRole::Property),
162        ],
163        conclusion: ConclusionTemplate::positive(
164            "The outcome prescribed by ?rule applies to ?case",
165            "rule_applies_?case",
166        ),
167        critical_questions: vec![
168            CriticalQuestion::new(
169                1,
170                "Does ?rule actually apply to ?case?",
171                Challenge::PremiseTruth("case".into()),
172            ),
173            CriticalQuestion::new(
174                2,
175                "Is ?rule still valid and in force?",
176                Challenge::PremiseTruth("rule".into()),
177            ),
178        ],
179        metadata: SchemeMetadata {
180            citation: "Walton 2008 p.318".into(),
181            domain_tags: vec!["popular".into(), "legal".into(), "normative".into()],
182            presumptive: true,
183            strength: SchemeStrength::Strong,
184        },
185    }
186}
187
188#[cfg(test)]
189mod tests {
190    use super::*;
191
192    #[test]
193    fn all_returns_four_popular_schemes() {
194        assert_eq!(all().len(), 4);
195    }
196
197    #[test]
198    fn established_rule_has_strong_strength() {
199        assert_eq!(
200            argument_from_established_rule().metadata.strength,
201            SchemeStrength::Strong
202        );
203    }
204
205    #[test]
206    fn popular_ids_are_in_offset_range() {
207        for s in all() {
208            assert!(s.id.0 >= POPULAR_ID_OFFSET);
209            assert!(s.id.0 < POPULAR_ID_OFFSET + 100);
210        }
211    }
212}